上周我问了同样的问题,最后得到了用户@Aaron解决问题的方法。但是,我再问一遍,因为代码在一个项目中工作完全但在几乎完全相同的条件下不能在另一个项目中工作(即列数/行数,变量类型,如何DGV已填充。
//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;
}
}
}
}
问题:
一旦我奇怪地点击“确定”,就会创建ComboBox。如果我重复这个过程,它最终将使用ComboBox填充每个单元格,但每当我将鼠标悬停在它们上面时,都会弹出相同的错误消息。
是否将单元格设置为组合框,然后尝试返回同一单元格?
解决
简单的解决方案 - 必须添加一个c.Value =#来设置值。
答案 0 :(得分:0)
避免上述问题。您可以为DataError
添加DataGridView
个活动。
尝试以下代码:
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
}
}
答案 1 :(得分:0)
必须将ComboBox的初始值设置为某个值。
c.Value = #