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的源。