我试图在我的数据视图中加入3个绑定的DataGridViewComboBoxCell,
一个用于“类别”表,第二个用于“文章”表,第三个用于
“ArticleNonCon”桌。当我选择第二个类别时
DataGridViewComboBoxCell应该给我这个类别的文章
当我选择一篇文章时,第三个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事件中呢?
提前谢谢。
发布于 2015-03-03 09:10:32
假设您有一个没有任何现有数据的DataGridView。无论如何,你必须创建数据。在您的例子中,它可能是一个只有3个属性的类。
public class MyDataSource
{
public int CategoryID { get; set; }
public int ArticleID { get; set; }
public int ArticleNonCon { get; set; }
}我们还需要一些表示我们的ComboBox数据源的类:
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 (它将存储您的ComboBoxes的ValueMembers )。将以下代码放入初始化方法中:
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的DataGridView事件(否则,当尝试添加带有空数据的新行时会出现异常)。
dataGridView.Columns.Add(new DataGridViewComboBoxColumn
{
Name = "ArticleColumn",
DataSource = listArticles,
ValueMember = "ID",
DisplayMember = "Name",
DataPropertyName = "ArticleID"
});这个应该行。(这就是在Winforms中绑定和显示数据的方法)
https://stackoverflow.com/questions/28826669
复制相似问题