c# – 如何将DataGridViewComboBoxCell转换为DataGridViewTextBoxCell

我搜索了很多这个错误很多同样的问题已被问到,但它没有解决我的问题.
我正进入(状态

Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function.

方案是我有使用TextboxColumn的datagridview我使用CellBeginEdit在ComboBoxColumn中转换它,在CellValidate之后我再次将ComboBoxColumn更改为TextboxColumn.这些代码适用于所有人.但是在确切的行中获得所述错误e.RowIndex = 2会抛出此异常,但是其他行的剂量不会显示错误.如果我省略此错误并继续,则e.RowIndex = 2单元格值变为空白,其他行值起作用.

这是CellBeginEdit的代码

 if (e.ColumnIndex == 2 && e.RowIndex >= 0)
  {
    try
     {
      string s = Convert.ToString(_dgvCoarseAggegateTest[e.ColumnIndex, e.RowIndex].Value);
      string s1 = Convert.ToString(_dgvCoarseAggegateTest[e.ColumnIndex, 0].Value);
      DataGridViewComboBoxCell c = new DataGridViewComboBoxCell();

      string _SizeName = _cGetParrent._mGetParentCellValue(ref _dgvCoarseAggegateTest, e.RowIndex, 1);                  
      _mFillSieveSizeGridCombo(_mGetMetalSizeID(_SizeName), ref c); // Here My Combo Will GetValues from SQL and it Returning Value
      _dgvCoarseAggegateTest[e.ColumnIndex, e.RowIndex] = c; // Heres the error When e.RowIndex == 2 and if e.RowIndex != 2 then no error
      _dgvCoarseAggegateTest[e.ColumnIndex, e.RowIndex].Value = s;
      _dgvCoarseAggegateTest[e.ColumnIndex, 0].Value = s1;
     }
     catch (Exception ex)
      {
        MessageBox.Show(ex.Message);
      }
    }

如何解决这个问题.

更新:
用户没有行会添加新行和选择值,基本的东西是我想显示组合并填充数据库中的值,填充值取决于条件,所以每次新值都会到来,

样本数据

testTable
1      A
2      B
3      C
4      D
5      E
6      F
7      G
8      H
9      I

在第1列中,我添加了一个值为1到9的组合,在_mFillSieveSizeGridCombo中我将id传递给sql server 2008并使用Combo.Item.Add(x)方法填充组合.

解决方法:

SetCurrentCellAddressCore()中有一个标志,可防止任何重入调用破坏DataGridView的内部值. Usaully引发了一个事件,其中flag = true并在事件结束时重置.

要解决此问题,您只需在事件中添加一个BeginInvoke()包装器,即可在事件发生后使用异步运行.

编辑

可以在EditOnEnter模式下重现该问题,并且BeginInvoke中事件外部的单元格设置器会导致无限循环

private bool _suppressCellBeginEdit = false;
private void dgv_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
    var dgv = sender as DataGridView;
    if (_suppressCellBeginEdit)
        return;

    if (e.ColumnIndex == 2 && e.RowIndex >= 0)
    {
        string s = Convert.ToString(dgv[e.ColumnIndex, e.RowIndex].Value);
        string s1 = Convert.ToString(dgv[e.ColumnIndex, 0].Value);
        DataGridViewComboBoxCell c = new DataGridViewComboBoxCell();

        c.Items.Add(string.Format("x{0}:y{1} {2}", e.RowIndex, e.ColumnIndex, 0));
        c.Items.Add(string.Format("x{0}:y{1} {2}", e.RowIndex, e.ColumnIndex, 1));
        c.Items.Add(string.Format("x{0}:y{1} {2}", e.RowIndex, e.ColumnIndex, 2));

        // special handling
        if (e.RowIndex == e.ColumnIndex)
        {
            this.BeginInvoke(new Action(() =>
            {
                _suppressCellBeginEdit = true;
                this.Invoke(new Action(() => 
                    {
                        c.Value = s;
                        dgv[e.ColumnIndex, e.RowIndex] = c;
                        dgv[e.ColumnIndex, 0].Value = s1;
                    }));
                _suppressCellBeginEdit = false;
            }));
        }
        else
        {
            c.Value = s;
            dgv[e.ColumnIndex, e.RowIndex] = c;
            dgv[e.ColumnIndex, 0].Value = s1;
        }
    }
}
上一篇:MCU 是如何从上电复位运行到 main 函数的?


下一篇:C#DataGridViewComboBoxColumn绑定问题