我在表单的DataGridViewComboBoxColumn
事件处理程序中向DataGridView
添加了Load
,并在列中设置了每个DataGridViewComboBoxCell
的DataSource。但是,一旦显示表单,每个DataGridViewComboBoxCell
的数据源都已设置为null
。这是我用来填充列及其单元格的代码:
DataGridViewComboBoxColumn comboCol;
comboCol = new DataGridViewComboBoxColumn();
comboCol.Name = "ComboCol";
comboCol.HeaderText = "Combo Column";
comboCol.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
this.dgv.Columns.Add(comboCol);
for (int i = 0; i < dgv.Rows.Count; i++)
{
// This datatable is actually populated here!
DataTable myData = PopulatedDataTable(dgv.Rows[i].Cells["info"].Value);
DataGridViewComboBoxCell DCC = new DataGridViewComboBoxCell();
DCC = (DataGridViewComboBoxCell)dgv.Rows[i].Cells["CombolCol"];
DCC.DataSource = myData;
DCC.DisplayMember = "Association"; // Association is a column in myData
DCC.ValueMember = "Association";
}
dgv.Columns["association"].Visible = false;
如果我把它放在我单击表单加载后单击的按钮中,这段代码完全符合预期,但在表单加载期间执行时,数据源被清除。有什么建议吗?
答案 0 :(得分:6)
我最终通过处理datagrid的DataBindingComplete
事件来修复此问题。
显然,当您在表单的Load
事件期间填充数据网格时,数据网格中的数据会被反弹。这搞砸了我试图添加的未绑定列中的数据。
将我的代码放在DataBindingComplete
事件处理程序中(并在开头禁用事件处理程序并在事件结束时重新启用它)时,会在适当的时间添加列,并将其数据添加到并没有被.NET的愚蠢所扰乱。
答案 1 :(得分:4)
是的,我挣扎了两天,最后DataBinding事件修复了它。
以下是将组合框单元格添加到DataGridView上的某些单元格的完整代码。
private void LoadGrid()
{
DataTable dtbl = new DataTable();
dtbl.Columns.Add("FieldNo");
dtbl.Columns.Add("FieldValue");
for (int i = 0; i < 10; i++)
{
DataRow dr = dtbl.NewRow();
dr["FieldNo"] = i;
dr["FieldValue"] = "Name " + i.ToString();
dtbl.Rows.Add(dr);
}
dataGridView1.DataSource = dtbl;
dataGridView1.DataError += new DataGridViewDataErrorEventHandler(dtgv_ComboDataError);
}
private void dtgv_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (i % 2 == 0)
{
DataGridViewComboBoxCell dCmb = new DataGridViewComboBoxCell();
dCmb.Items.Add("Yes");
dCmb.Items.Add("No");
dCmb.Value = dCmb.Items[0];
dataGridView1["FieldValue", i] = dCmb;
((DataGridViewComboBoxCell)dataGridView1["FieldValue", i]).DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox;
}
}
}
void dtgv_ComboDataError(object sender, DataGridViewDataErrorEventArgs e)
{
//Nothing needed here
}
答案 2 :(得分:1)
我一直在使用DataGridView
在DataGridViewComboBoxColumn
上遇到类似问题。
DataGridView
绑定到DataSet
DataGridViewComboBoxCell
单元格下拉选项将根据同一行中另一个单元格的值进行填充。
我是否在输入ComboBox
事件处理程序之前手动填写DataGridViewComboBoxCell.Items
单元格项目(DataGridViewComboBoxCell.DataSource
属性)或使用DataBinding(CellFormatting
属性)正确,但只要处理程序中的执行步骤myComboBoxCell.Items.Count
下降到零。
如果单元格的值不是DBNull.Value
,则会引发令人讨厌的“System.ArgumentException:DataGridViewComboBoxCell值无效”。 (因为myComboBoxCell.Value
)
myComboBoxCell.Items
我的“解决方案”更像是解决方法:
我处理DataGridView.DataError
事件并在该处理程序中填写相关的DataGridComboBoxCell
DataSource。然后取消异常(e.ThrowException = False
)。
我觉得有点太脏了,但它确实有效。