C#DataGridView可重入调用错误

时间:2013-10-01 15:41:13

标签: c# datagridview

不确定究竟发生了什么。我正在尝试在输入单元格时将列单元格类型更改为组合框。当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;
   }
}

1 个答案:

答案 0 :(得分:1)

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

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

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