C# DataGridView 重入调用错误

本文关键字:调用 错误 DataGridView | 更新日期: 2023-09-27 18:33:24

不知道到底发生了什么。我正在尝试在输入单元格时将列单元格类型更改为组合框。它适用于每一行,除非 RowIndex 和 ColumnIndex 相同。当我选择该行/列时,我得到"操作无效,因为它会导致对 SetCurrentCellAddressCore 函数的重入调用。

dgv1_CellEnter(object sender, DataGridViewCellEventArgs e)
{
  if(e.ColumnIndex == dgv1.Columns["ColumnName"].Index)
  {
    DataGridViewComboBoxCell cmbCell = new DataGridViewComboBoxCell();
    foreach(string v in values)
    {
      cmbCell.Items.Add(v);
    }
    dgv1.Rows[e.RowIndex].Cells["UnitEchelon"] = cmbCell;
   }
}

C# DataGridView 重入调用错误

我已经测试了您的代码,当RowIndex等于 ColumnIndex 时,您报告的错误不会出现,而是当给定单元格已经是DataGridViewComboBoxCell类型时。因此,可以通过以下方式轻松避免此错误:

if (dgv1.Rows[e.RowIndex].Cells["UnitEchelon"].GetType() != typeof(DataGridViewComboBoxCell))
{
    dgv1.Rows[e.RowIndex].Cells["UnitEchelon"] = cmbCell;
}

请注意,尽管给定类型(组合框、文本等)是在单元格级别设置的,但初始类型是在列级别创建的(插入列时)。您正在执行的操作可能被视为非 100% 正确/预期:假定列中的所有单元格都具有相同的类型;而且您不是通过依赖属性来更改单元格的类型(例如,EditType ),而只是通过赋值具有目标类型的变量。最后一条评论是为了以某种方式解释如此僵化的行为(为什么它不会在不触发错误的情况下来回执行更改)。