2011-03-14 21 views
4

我在表单的Load事件处理程序中将DataGridViewComboBoxColumn添加到DataGridView,并在列中设置每个DataGridViewComboBoxCell的数据源。但是,一旦显示表格,每个DataGridViewComboBoxCell的数据源已被设置为null。下面是我用填充柱的代码,它的细胞:一旦表格显示,DataGridViewComboBoxCell.DataSource设置为空

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

你什么时候设置DataGridView的数据源?尝试在DataGridViewComboBoxCell.DataSource之前设置DataGridView数据源。 –

+0

我已经在单个单元的源代码之前设置了DataGridView的源代码。 –

回答

6

我最终通过处理数据网格的DataBindingComplete事件来修复此问题。

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

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

1

我一直在与与DataGridViewComboBoxColumn非常类似的问题挣扎。

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

无论我在ComboBox电池项目填补手动(DataGridViewComboBoxCell.Items属性)或使用数据绑定(DataGridViewComboBoxCell.DataSource属性),对进入CellFormatting事件处理程序的值是正确的,但只要在处理程序的执行步骤之前,myComboBoxCell.Items.Count去降至零。

如果单元格的值不是DBNull.Value,则会抛出一个讨厌的“System.ArgumentException:DataGridViewComboBoxCell值无效”。 (因为myComboBoxCell.Value不受myComboBoxCell.Items含)

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

这是有点太脏,我不喜欢,但它的作品。

4

是的,我挣扎了两天,最后DataBinding Event修复了它。

这是将组合框单元格添加到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 
    }