在DataGridView的特定单元格中设置组合框

问题描述:

上周我问了同样的问题,最终得到了解决我的问题的方法,这要感谢用户@Aaron。然而,我再次问,因为代码在一个项目中完全工作,但在几乎完全相同的条件下(即,列数/行数,变量类型,DGV如何填充),在另一个项目中不起作用。 。在DataGridView的特定单元格中设置组合框

//This is my code to go through each cell in the DataGridView. 
for (int i = 0; i < dgvTest.RowCount; i++) 
     { 
      for (int j = 0; j < dgvTest.ColumnCount; j++) 
      { 
       foreach (Information info in frmMain._dbList) 
       { 
        if (dgvTest.Rows[i].Cells[j].Value.ToString().ToLower() == info.InfoName.ToLower() && info.InfoInputType == "1") 
        { 
         DataGridViewComboBoxCell c = new DataGridViewComboBoxCell(); 
         c.Items.Add("0"); 
         c.Items.Add("1"); 
         dgvTest.Rows[i].Cells[(j + 1)] = c; 

        } 
       } 
      } 
     } 

问题:

Error Message

当我点击 “确定” 奇怪的是,它创建的组合框。如果我重复这个过程,它最终会用ComboBox填充每个单元格,但是只要我将鼠标悬停在它们上面,就会弹出相同的错误消息。

它是否将单元格设置为组合框,然后尝试回到同一单元格?

解决

简单的解决方案 - 必须添加一个c.Value =#设定值。

必须将组合框的初始值设置为某个值。

c.Value = # 

为了避免上述问题。您可以为您的DataGridView添加DataError事件。

试试下面的代码:

private void dgvTest_DataError(object sender, DataGridViewDataErrorEventArgs e) 
{ 
    try 
    { 
     if (e.Exception.Message.contains("DataGridViewComboBoxCell value is not valid.")) 
     { 
      object value = dgvTest.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; 
      if (!((DataGridViewComboBoxColumn)dgvTest.Columns[e.ColumnIndex]).Items.Contains(value)) 
      { 
       ((DataGridViewComboBoxColumn)dgvTest.Columns[e.ColumnIndex]).Items.Add(value); 
      } 
     } 

     throw e.Exception; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(string.Format(@"Failed to bind ComboBox. " 
      + "Please contact support team with below error message:" 
      + "\n\n" + ex.Message)); 
    } 
} 

以上,将引发错误信息给用户。如果你想压制这个错误。您只需按照以下代码:

private void dgvTest_DataError(object sender, DataGridViewDataErrorEventArgs e) 
{ 
    try 
    { 
     if (e.Exception.Message.contains("DataGridViewComboBoxCell value is not valid.")) 
     { 
      object value = dgvTest.Rows[e.RowIndex].Cells[e.ColumnIndex].Value; 
      if (!((DataGridViewComboBoxColumn)dgvTest.Columns[e.ColumnIndex]).Items.Contains(value)) 
      { 
       ((DataGridViewComboBoxColumn)dgvTest.Columns[e.ColumnIndex]).Items.Add(value); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     //do nothing 
    } 
} 
+0

感谢您的快速回复!在ExceptionPolicy中出现错误?这是Visual Studio的内置功能还是HandleException类ExceptionPolicy中包含的方法? – Yahtzee

+0

@Yahtzee不需要它。你只是处理这个异常并显示消息框。我修改了答案。 –

+0

我不认为异常正在被打,因为错误信息并不那么简单。我编辑了我的问题并上传了错误消息的图片。 – Yahtzee