2017-03-04 19 views
1

このチュートリアルでは、データソースはAOD.NETエンティティデータモデルですが、ここではAccessデータベースを使用しています。私は、コードをコンパイルしたが、C#DataGridViewからExcelファイルへのエラー

The name 'productBindingSource' does not exist in the current context
または
The name 'DB' does not exist in the current context
または
The type or namespace name 'Product' could not be found

のような様々なエラーを取得しています、私はわからないんだけど、私は参照を追加見逃している場合は、これらのエラーであればデータソースが異なるためですか?

Visual Studioで自動的に//TODO: This line of code etc...が追加され、チュートリアルの表示方法に変更されました。

私が間違っていることを誰かに見せてくれることを願っていますか?

チュートリアル:https://www.youtube.com/watch?v=-wGzK1vsqS8

enter image description here

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace ExportWebsiteData 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void label1_Click(object sender, EventArgs e) 
     { 

     } 

     private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
     { 
      List<Product> list = ((DataParameter)e.Argument).ProductList; 
      string filename = ((DataParameter)e.Argument).FileName; 
      Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 
      Workbook wb = excel.Workbooks.Add(XlSheetType.xlWorksheet); 
      Worksheet ws = (Worksheet)excel.ActiveSheet; 
      excel.Visible = false; 
      int index = 1; 
      int process = list.Count; 
      //Add Column 
      ws.Cells[1, 1] = "Item Number"; 
      ws.cells[1, 2] = "Model"; 
      ws.cells[1, 3] = "Manufacturer"; 
      ws.cells[1, 4] = "Category"; 
      ws.cells[1, 5] = "Subcategory"; 
      // 
      foreach(Product p in list) 
      { 
       if (!backgroundWorker.CancellationPending) 
       { 
        backgroundWorker.ReportProgress(index++ * 100/process); 
        ws.Cells[index, 1] = p.ItemNumber.ToString(); 
        ws.Cells[index, 2] = p.Model.ToString(); 
        ws.Cells[index, 3] = p.Manufacturer.ToString(); 
        ws.Cells[index, 4] = p.Category.ToString(); 
        ws.Cells[index, 5] = p.SubCategory.ToString(); 
       } 
      } 
      //Save file 
      ws.SaveAs(filename, XlFileFormat.xlWorkbookdefault, Type.Missing, Type.Missing, true, false, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing); 
      excel.Quit(); 
     } 

     struct DataParameter 
     { 
      public List<Product> ProductList; 
      public string FileName { get; set; } 
     } 

     DataParameter _inputParameter; 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      using (this.inventoryTableAdapter.Fill(this._Wizard_Data_2016_10_17DataSet.Inventory); = new _Wizard_Data_2016_10_17DataSet()) 
      { 
       productBindingSource.DataSource = DB.Products.ToList(); 
      } 

      // TODO: This line of code loads data into the '_Wizard_Data_2016_10_17DataSet.Inventory' table. You can move, or remove it, as needed. 
      //this.inventoryTableAdapter.Fill(this._Wizard_Data_2016_10_17DataSet.Inventory); 

     } 

     private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      progressBar.Value = e.ProgressPercentage; 
      lblStatus.Text = string.Format("Processing...{0}", e.ProgressPercentage); 
      progressBar.Update(); 
     } 

     private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      if(e.Error == null) 
      { 
       Thread.Sleep(100); 
       lblStatus.Text = "Your data has been successfully exported."; 
      } 
     } 

     private void btnExport_Click(object sender, EventArgs e) 
     { 
      if (backgroundWorker.IsBusy) 
       return; 
      using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xls" }) 
      { 
       if (sdf.ShowDialog() == DialogResult.OK) 
       { 
        _inputParameter.FileName = sfd.FileName; 
        _inputParameter.ProductList = productBindingSource.DataSource as List<product>; 
        progressBar.Minimum = 0; 
        progressBar.Value = 0; 
        backgroundWorker.RunWorkerAsync(_inputParameter); 
       } 
      } 
     } 
    } 
} 

UPDATE:

ジョンの答えは私のエラーを修正しましたが、データ・グリッドは、現在CSコードの代わりに、データベースによって移入されています。誰かが私が問題だと思うものを私に知らせることができれば、問題をより詳細に説明するビデオを作りました。

https://www.dropbox.com/s/1l5iw1j32a6oroj/C%23Excel.wmv?dl=0

+1

こんにちはアレックスは、その他にも、この質問を見て、それが既に回答されていない場合がありますので、あなたの質問は(への接続アクセスDB)は元の投稿とは異なります。あなたのアクセスデータベースに接続する方法が複数あるので、私は少し時間をかけて答えを試してみます。これは、この接続が行われているところである 'Form1_Load'コードに焦点を当てるために別の質問を投稿することを検討するかもしれません。ご希望の場合は、チャットをセットアップすることができれば助かります。 – JohnG

+0

こんにちはジョン、私たちはどのように進むのですか? – UserSN

+1

しばらくお待ちください。可能であれば、私は試してみます。 – JohnG

答えて

1

掲載コードから、いくつかのエラーやタイプミスがあります。データを取得する方法にはいくつか問題があると思われます。これを解消するために、使用されるデータがProductオブジェクトのリストであるように見えるので、以下のコードはListProductオブジェクトを使用しています。リストには、いくつかのテストデータが入力されます。このテストデータはDataGridViewDataSourceとして使用されます。データがDataGridViewに入ると、エクスポートボタンはデータをDataGridViewからExcelワークブックに正常にエクスポートします。上記掲載のコードで

タイプミス:

ws.Cells[1, 1] = "Item Number"; 
ws.cells[1, 2] = "Model"; 

小文字の「C」セル列2,3,4,5のためには、エラーが見つかりません定義をスローします。この上

ws.SaveAs(filename, XlFileFormat.xlWorkbookdefault, ……); 

バージョンに依存してもよい、xlWorkbookdefaultは大文字の「D」が必要です。

XlFileFormat.xlWorkbookDefault 

最終タイプミスが続いて、次の行SaveFileDialog

SaveFileDialog sfd = new SaveFileDialog() 

ためShowDialogであります使用しようとします:

sdf.ShowDialog() 

上記の行は "sdf"ではなく "sfd"でなければなりません。

あなたが投稿した画像を見てエラーを表示し、あなたがリンクしたビデオを見た後、ビデオが欠落している可能性があることがいくつかあります。上から順に、Productという名前の定義がありません。これはクラスのように見え、クラスからはアイテム番号、モデル、製造元、カテゴリ、サブカテゴリが表示されます。ビデオがこれを無視するか、またはProductが私が紛失しているものであるかどうかはわかりません。この欠落した定義を修正するこの場合、上記のコードでProductクラスを作成しました。あなたはコード内で使用して文が欠落しているため

public class Product { 
    public string ItemNumber { get; set; } 
    public string Model { get; set; } 
    public string Manufacturer { get; set; } 
    public string Category { get; set; } 
    public string SubCategory { get; set; } 

    public Product(string iNum, string model, string manuf, string cat, string subCat) { 
    ItemNumber = iNum; 
    Model = model; 
    Manufacturer = manuf; 
    Category = cat; 
    SubCategory = subCat; 
    } 

次の2つのエラー(XlFileFormatとXlSaveConflictResolution)が生成されます。これはビデオから除外されているようです。これらの2つのエラーを修正するには、usingステートメントがあるファイルの先頭に行を置きます。

using Microsoft.Office.Interop.Excel; 

エラー:int:usingステートメントで使用される型...以下のフォームの読み込みを参照してください。

2つのエラーproductBindingSourceは存在しません。ビデオはBackgroundWorkerをフォームに配置しましたが、私はBindingSourceを配置していませんでした。デザイナーでこれを修正するには、ツールボックスからBindingSourceコンポーネントを選択してフォームにドロップし、その名前をproductBindingSourceに変更します。

「DB」エラーは、製品オブジェクトのリストを使用するためにコメントアウトされます。 Form_Loadを参照してください。

「スレッド」エラーは、usingステートメントがないことを示します。下の行は、他のusingステートメントとともに置きます。

using System.Threading; 

「sdf」は上記のとおりです。最後のエラーは、以下の行からのものである:

productBindingSource.DataSource as List<product>; 

product大文字「P」を有するべきである:からなる上記の変更によりList<Product>;

を、唯一のエラーはのForm_Loadメソッドであるべきです。

private void Form1_Load(object sender, EventArgs e) 
{ 
    using (this.inventoryTableAdapter.Fill(this._Wizard_Data_2016_10_17DataSet.Inventory); = new _Wizard_Data_2016_10_17DataSet()) 
    { 
    productBindingSource.DataSource = DB.Products.ToList(); 
    } 
} 

上の行は不正な形式ですが、DataSetを取得しようとしているように見えます。私は後であなたの配慮のためにこれを残します。 productBindingSourceはProductオブジェクトのListを取っているように見えるので、コードはこれを置き換え、テストデータ用ProductオブジェクトListを作成しました。 メソッドがproductBindingSourceをテストデータのリストに設定する下のコードに変更された場合、このバインディングソースはDataGridViewDataSourceとして割り当てられます。これはビデオにはありません。

private void Form2_Load(object sender, EventArgs e) { 
    List<Product> list = GetProductList(); 
    productBindingSource.DataSource = list; 
    dataGridView1.DataSource = productBindingSource; 
} 

上記のコードを変更すると、コードが期待どおりに書き出されます。お役に立てれば。

private List<Product> GetProductList() { 
    List<Product> products = new List<Product>(); 
    for (int i = 0; i < 14; i++) { 
    products.Add(new Product(i.ToString(), "Model_" + i, "Manufacture_" + i, "Cat_" + i, "SubCat_" + i)); 
    } 
    return products; 
} 

編集更新は、クラスを使用せずに、Accessデータベースからテーブルを取得する

System.Data.DataTable dt = new System.Data.DataTable(); 

public Form2() { 
    InitializeComponent(); 
} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { 
    //List<Product> list = ((DataParameter)e.Argument).ProductList; 
    System.Data.DataTable list = ((DataParameter)e.Argument).ProductList; 
    string filename = ((DataParameter)e.Argument).FileName; 
    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application(); 
    Workbook wb = excel.Workbooks.Add(XlSheetType.xlWorksheet); 
    Worksheet ws = (Worksheet)excel.ActiveSheet; 
    excel.Visible = false; 
    int index = 1; 
    //int process = list.Count; 
    int process = list.Rows.Count; 
    //Add Column 
    ws.Cells[1, 1] = "Item Number"; 
    ws.Cells[1, 2] = "Model"; 
    ws.Cells[1, 3] = "Manufacturer"; 
    ws.Cells[1, 4] = "Category"; 
    ws.Cells[1, 5] = "Subcategory"; 
    foreach (DataRow dr in list.Rows) { 
    if (!backgroundWorker.CancellationPending) { 
     backgroundWorker.ReportProgress(index++ * 100/process); 
     ws.Cells[index, 1] = dr.ItemArray[1].ToString(); 
     ws.Cells[index, 2] = dr.ItemArray[2].ToString(); 
     ws.Cells[index, 3] = dr.ItemArray[3].ToString(); 
     ws.Cells[index, 4] = dr.ItemArray[4].ToString(); 
     ws.Cells[index, 5] = dr.ItemArray[5].ToString(); 
    } 
    } 
    //Save file 
    ws.SaveAs(filename, XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing, true, false, XlSaveConflictResolution.xlLocalSessionChanges, Type.Missing, Type.Missing); 
    excel.Quit(); 
} 

struct DataParameter { 
    public System.Data.DataTable ProductList; 
    public string FileName { get; set; } 
} 

DataParameter _inputParameter; 

private void Form2_Load(object sender, EventArgs e) { 
    string ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Test\Test3.accdb"; 
    using (OleDbConnection olcon = new OleDbConnection(ConnectionString)) { 
    using (OleDbDataAdapter adapter = new OleDbDataAdapter()) { 

     string command = "SELECT * FROM [Products]"; 
     //cmd.CommandText = "SELECT * FROM [" + sheetName + "]"; 

     OleDbCommand cmd = new OleDbCommand(command, olcon); 
     //Fill Gridview with Data from Access 
     try { 
     dt.Clear(); 
     adapter.SelectCommand = cmd; 
     adapter.Fill(dt); 
     productBindingSource.DataSource = dt; 
     dataGridView1.DataSource = productBindingSource; 
     } 
     catch (Exception ex) { 
     MessageBox.Show(ex.ToString()); 
     } 
     finally { 
     olcon.Close(); 
     var totalWidth = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.None); 
     } 
    } 
    } 

} 

private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { 
    progressBar.Value = e.ProgressPercentage; 
    lblStatus.Text = string.Format("Processing...{0}", e.ProgressPercentage); 
    progressBar.Update(); 
} 

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { 
    if (e.Error == null) { 
    Thread.Sleep(100); 
    lblStatus.Text = "Your data has been successfully exported."; 
    } 
} 

private void btnExport_Click(object sender, EventArgs e) { 
    if (backgroundWorker.IsBusy) 
    return; 
    using (SaveFileDialog sfd = new SaveFileDialog() { Filter = "Excel Workbook|*.xls" }) { 
    if (sfd.ShowDialog() == DialogResult.OK) { 
     _inputParameter.FileName = sfd.FileName; 
     //_inputParameter.ProductList = GetProductsList2(); 
     _inputParameter.ProductList = (System.Data.DataTable)productBindingSource.DataSource; 
     progressBar.Minimum = 0; 
     progressBar.Value = 0; 
     backgroundWorker.RunWorkerAsync(_inputParameter); 
    } 
    } 
} 
+0

何が起こっているのか、それを修正する方法を理解する上で、この詳細な回答が本当に役に立ちます。 ありがとうございます。 – UserSN

+0

もう一度お返事いただき、ありがとうございます。私の知識でC#の知識が不足しているために不正な形式の 'Connection String'がビデオに表示されたものから' datagrid'に 'access database'の情報を読み込むように変更しました。データソースを 'northwinds DB'から取得します。 私はアプリケーションがエラーなしで実行しますが、アクセスデータベースから取得するのではなく、データグリッドにデータを取り込みます(私たちは.csファイルにハードコードしていると思います)。 私はいくつかの専門用語で間違っている場合私はC#の知識に限定されています – UserSN

+0

私は短いビデオで、私が上記のコメントで説明しようとしていることを少し説明しました。見てください。 https://www.dropbox.com/s/1l5iw1j32a6oroj/C%23Excel.wmv?dl=0 非常に高く評価されています。 アレックス – UserSN

関連する問題