一旦显示表单,DataGridViewComboBoxCell.DataSource将设置为null

时间:2011-03-14 15:47:25

标签: c# winforms datagridview datagridviewcomboboxcell

我在表单的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;

如果我把它放在我单击表单加载后单击的按钮中,这段代码完全符合预期,但在表单加载期间执行时,数据源被清除。有什么建议吗?

3 个答案:

答案 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)

我一直在使用DataGridViewDataGridViewComboBoxColumn上遇到类似问题。

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)。

我觉得有点太脏了,但它确实有效。