4

我在表单的事件处理程序期间添加DataGridViewComboBoxColumna并设置列中每个的 DataSource 。但是,一旦显示表单,每个表单的 DataSource都已设置为. 这是我用来填充列及其单元格的代码:DataGridViewLoadDataGridViewComboBoxCellDataGridViewComboBoxCellnull

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;

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

4

3 回答 3

6

我最终通过处理DataBindingComplete数据网格的事件解决了这个问题。

显然,当您在表单事件期间填充数据网格时Load,数据网格中的数据会反弹。这搞砸了我试图添加的未绑定列中的数据。

通过将我的代码放在DataBindingComplete事件处理程序的上方(并在开始时禁用事件处理程序并在事件结束时重新启用它)在适当的时间添加列,并且它们的数据不会被.NET的愚蠢打乱.

于 2011-05-05T13:57:35.020 回答
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
    } 
于 2012-03-22T14:14:47.793 回答
1

我一直在努力解决与 a 非常相似的DataGridView问题DataGridViewComboBoxColumn

DataGridView绑定到一个单元DataSetDataGridViewComboBoxCell下拉选项将根据同一行的另一个单元格的值进行填充。

无论我是ComboBox手动填写单元格项目(DataGridViewComboBoxCell.Items属性)还是使用 DataBinding(DataGridViewComboBoxCell.DataSource属性),在进入CellFormatting事件处理程序之前,值都是正确的,但是一旦处理程序中的执行步骤myComboBoxCell.Items.Count下降到零。

如果单元格的值不是DBNull.Value,这将引发令人讨厌的“System.ArgumentException:DataGridViewComboBoxCell 值无效”。(因为myComboBoxCell.Value不包含在 中myComboBoxCell.Items

我的“解决方案”更多的是一种解决方法:我处理DataGridView.DataError事件并在该处理程序中填写相关的DataGridComboBoxCell数据源。然后取消异常 ( e.ThrowException = False)。

这对我来说有点太脏了,但它确实有效。

于 2011-05-04T07:59:30.247 回答