C# DataGridViewComboxCell.DataSource在显示表单后设置为null
在窗体的C# DataGridViewComboxCell.DataSource在显示表单后设置为null,c#,winforms,datagridview,datagridviewcomboboxcell,C#,Winforms,Datagridview,Datagridviewcomboboxcell,在窗体的Load事件处理程序中,我将DataGridViewComboBoxColumn添加到DataGridView中,并在列中设置每个DataGridViewComboxCell的数据源。但是,一旦显示表单,每个datagridviewcomboxcell的数据源都被设置为null。下面是我用来填充列及其单元格的代码: DataGridViewComboBoxColumn comboCol; comboCol = new DataGridViewComboBoxColumn(); comb
Load
事件处理程序中,我将DataGridViewComboBoxColumn
添加到DataGridView
中,并在列中设置每个DataGridViewComboxCell
的数据源。但是,一旦显示表单,每个datagridviewcomboxcell
的数据源都被设置为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;
DataGridViewComboxColumn comboCol;
comboCol=新的DataGridViewComboBoxColumn();
comboCol.Name=“comboCol”;
comboCol.HeaderText=“组合列”;
comboCol.AutoSizeMode=DataGridViewAutoSizeColumnMode.Fill;
this.dgv.Columns.Add(comboCol);
对于(int i=0;i
如果我把它放在一个按钮中,在表单加载后单击该按钮,那么这段代码将完全符合预期,但在表单加载期间执行时,数据源将被清除。有什么建议吗?我一直在用
datagridviewcomboxcolumn
处理DataGridView
上的一个非常类似的问题
DataGridView
绑定到一个DataSet
将根据同一行的另一个单元格的值填充datagridviewcomboxcell
单元格下拉选项
无论我是手动填写组合框
单元格项目(DataGridViewComboxCell.Items
属性)还是使用数据绑定(DataGridViewComboxCell.DataSource
属性),在输入CellFormatting
事件处理程序之前,值都是正确的,但一旦处理程序中的执行步骤,mycomboxcell.Items.Count
降至零
如果单元格的值不是DBNull.Value
,则会抛出一个令人讨厌的“System.ArgumentException:DataGridViewComboxCell值无效”。(因为mycomboxcell.Items
不包含mycomboxcell.Value
)
我的“解决方案”更多的是一种变通方法:
我处理DataGridView.DataError
事件,并在该处理程序中填写相关的datagridcomboxcell
DataSource。然后取消异常(e.throweexception=False
)
这对我来说有点太脏了,但它确实有效。我最终通过处理datagrid的
DataBindingComplete
事件解决了这个问题
显然,当您在表单的Load
事件期间填充数据网格时,数据网格中的数据会反弹。这把我要添加的未绑定列中的数据搞砸了
通过将我的代码放在上面的
DataBindingComplete
事件处理程序中(并在事件开始时禁用事件处理程序,在事件结束时重新启用),可以在适当的时间添加列,并且它们的数据不会因.NET的愚蠢而混乱。是,我与它斗争了两天,最后数据绑定事件修复了它
下面是向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
}
private void LoadGrid()
{
DataTable dtbl=新DataTable();
dtbl.列。添加(“字段号”);
dtbl.Columns.Add(“FieldValue”);
对于(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+=新的DataGridViewDataErrorEventHandler(dtgv_ComboDataError);
}
私有void dtgv_数据绑定完成(对象发送方,DataGridViewBindingCompleteEventTarget e)
{
对于(int i=0;i
何时设置DataGridView的数据源?尝试在DataGridViewComboxCell.datasource之前设置DataGridView数据源。我已经在单个单元格的源之前设置DataGridView的源。