【问题标题】:C# DataGridView reentrant call ErrorC# DataGridView 可重入调用错误
【发布时间】:2013-10-01 15:41:12
【问题描述】:

不确定到底发生了什么。输入单元格时,我正在尝试将列单元格类型更改为组合框。它适用于每一行,除非 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


    【解决方案1】:

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

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

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

    【讨论】:

    • 最简单的解释可能是无知。数据网格的数据源设置为 List 我试图显示的类属性是从可接受值列表派生的字符串值。根据您的指导,我将研究如何利用 EditType。
    • @Brad 请记住,EditType 不像“您的方法”那么简单。理想的情况是在添加每一列时在开始时设置列类型。请记住,通过添加 DataGridViewComboBoxCell 类型列,其上的所有单元格将默认获取此类型。示例代码(col 1 组合框中的所有单元格): DataGridViewComboBoxColumn curCol = new DataGridViewComboBoxColumn(); curCol.Name = "col 1"; curCol.Items.Add("item1"); curCol.Items.Add("item2"); dgv1.Columns.Add(curCol);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2017-04-07
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多