我搜索了很多这个错误很多同样的问题已被问到,但它没有解决我的问题.
我正进入(状态
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;
}
}
}