2015-03-03 50 views
0

我試圖把3在我的DataGridView綁定的DataGridViewComboBoxCell,的DataGridViewComboBoxCell值無效

一個「Categorie」表,第二個爲「第」表和第三的

「ArticleNonCon」表。當我選擇一個類別第二

的DataGridViewComboBoxCell應該給我這個categorie和

的文章時,我選擇了一篇文章第三的DataGridViewComboBoxCell應該給我

這篇文章的序列號。這是我試過的代碼:

在按鈕點擊

,顯示形式:

if (con.State != ConnectionState.Open) 
{ 
    con.Open(); 
} 

SqlCommand catCmd = new SqlCommand("SELECT IdCategorie, LibCategorieFr FROM Categorie", con); 
DataTable catDt = new DataTable(); 
catDt.Load(catCmd.ExecuteReader()); 
((DataGridViewComboBoxColumn)dataGridView1.Columns["CategorieColumn"]).DataSource = catDt;  
((DataGridViewComboBoxColumn)dataGridView1.Columns["CategorieColumn"]).DisplayMember = "LibCategorieFr"; 
((DataGridViewComboBoxColumn)dataGridView1.Columns["CategorieColumn"]).ValueMember = "IdCategorie"; 

,並在DataGridView的CellEndEdit事件:

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    switch (dataGridView1.Columns[e.ColumnIndex].Name) 
    { 
     case "CategorieColumn": 
      if (con.State != ConnectionState.Open) 
      { 
       con.Open(); 
      } 
      SqlCommand artCmd = new SqlCommand("SELECT * FROM Article WHERE IdCategorie = @IdCategorie", con); 
      artCmd.Parameters.AddWithValue("@IdCategorie", dataGridView1.CurrentRow.Cells["CategorieColumn"].Value); 
      DataTable articleDt = new DataTable(); 
      articleDt.Load(artCmd.ExecuteReader()); 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["Column3"]).DataSource = articleDt; 
       ((DataGridViewComboBoxColumn)dataGridView1.Columns["Column3"]).DisplayMember = "LibArticleFr"; 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["Column3"]).ValueMember = "CodeArticle"; 
      con.Close(); 
      break; 

     case "Column3": 
      if (con.State != ConnectionState.Open) 
      { 
       con.Open(); 
      } 

      SqlCommand numSerieCmd = new SqlCommand("SELECT * FROM ArticleNonCon WHERE CodeArticle = @CodeArticle", con); 
      numSerieCmd.Parameters.AddWithValue("@CodeArticle", dataGridView1.CurrentRow.Cells["Column3"].Value); 
      DataTable numSerieDt = new DataTable(); 
      numSerieDt.Load(numSerieCmd.ExecuteReader()); 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["NumSerieColumn"]).DataSource = numSerieDt; 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["NumSerieColumn"]).DisplayMember = "NumSerieArticle"; 
      ((DataGridViewComboBoxColumn)dataGridView1.Columns["NumSerieColumn"]).ValueMember = "id"; 
      con.Close(); 

      break; 
    } 
} 

該代碼完全適用於第一次運行,但是當我嘗試更改文章並從第三個datagridviewComboboxCell中選擇本文的序列號時,我得到以下異常:

System.ArgumentException:的DataGridViewComboBoxCell值無效

這個例外情況也發生在我嘗試關閉應用程序。

那麼如何解決這個錯誤或在哪個datagridview事件我應該把我的代碼?

在此先感謝。

+0

如何將數據綁定到DataGridView? – stefankmitph 2015-03-03 08:17:14

+0

datagridview不綁定我只是綁定3 DatagridviewComboboxCell – user4428204 2015-03-03 08:20:10

+0

你想達到什麼目的? DataGridView中沒有某種數據(DataSource)? – stefankmitph 2015-03-03 08:24:36

回答

0

假設您有一個根本沒有現有數據的DataGridView。無論如何你必須創建數據。你的情況可能是隻有3個屬性

public class MyDataSource 
{ 
    public int CategoryID { get; set; } 
    public int ArticleID { get; set; } 
    public int ArticleNonCon { get; set; } 
} 

我們還需要一些類,代表了我們的組合框的數據源類:

public class Category 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class Article 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

public class ArticleNonCon 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

這個類(如它的列表)將被連接到你的DataGridView是你的DataSource(它將存儲ComboBox的ValueMembers)。把下面的代碼到一個initialize方法:

List<MyDataSource> listMyDataSource = new List<MyDataSource>() // it's an empty list of MyDataSource 

dataGridView1.AutoGenerateColumns = false; // prevent DataGridView from adding columns we don't want to have 

dataGridView1.DataSource = new BindingList(listMyDataSource); // this is very important as we want to add new rows to our DataGridView. Adding just a list object wouldn't allow this 

現在,我們必須創建數據源爲我們ComboBoxColumns:

List<Category> listCategories = new List<Category> 
{ 
    new Category { ID = 1, Name = "Category1"}, 
    new Category { ID = 2, Name = "Category2"}, 
    new Category { ID = 3, Name = "Category3"}, 
}; 

List<Article> listArticles = new List<Article> 
{ 
    new Article { ID = 1, Name = "Article1"}, 
    new Article { ID = 2, Name = "Article2"}, 
    new Article { ID = 3, Name = "Article3"}, 
}; 

List<ArticleNonCon> listArticlesNonCon = new List<ArticleNonCon> 
{ 
    new ArticleNonCon{ ID = 1, Name = "ArticleNonCon"}, 
    new ArticleNonCon{ ID = 2, Name = "ArticleNonCon"}, 
    new ArticleNonCon{ ID = 3, Name = "ArticleNonCon"}, 
}; 

這當然只是範例資料...所以從您的數據填充數據庫。

現在,我們的列添加到DataGridView:

dataGridView.Columns.Add(new DataGridViewComboBoxColumn 
{ 
    Name = "CategoryColumn", 
    DataSource = listCategories, 
    ValueMember = "ID", // property of our class Category 
    DisplayMember = "Name", // property of our class Category 
    DataPropertyName = "CategoryID" // bind it to the property CategoryID from our class MyDataSource 
}); 
... 

這同樣適用於第三和ArticleNonCon。

你需要做的一件事就是:訂閱DataGridView的DataError事件(否則當試圖添加一個含有空數據的新行時會發生異常)。

dataGridView.Columns.Add(new DataGridViewComboBoxColumn 
{ 
    Name = "ArticleColumn", 
    DataSource = listArticles, 
    ValueMember = "ID", 
    DisplayMember = "Name", 
    DataPropertyName = "ArticleID" 
}); 

這應該做。 (這是在Winforms中綁定和顯示數據的方式)

+0

非常感謝,我會嘗試你的代碼 – user4428204 2015-03-03 09:15:23

+0

有什麼進展? – stefankmitph 2015-03-03 10:37:14