4

私はこのエラーをたくさん検索しましたが、同じ質問がすでに多く寄せられていますが、問題は解決していません。私は得ています

SetCurrentCellAddressCore 関数への再入可能呼び出しになるため、操作は無効です。

シナリオはdatagridviewTextboxColumn 私が使用CellBeginEditして変換し、 ComboBoxColumn を TextboxColumn に再度変更しComboBoxColumnた後です。CellValidateコードはすべての人に有効です。しかし、正確な行で上記のエラーを取得すると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);
      }
    }

これを解決する方法。

UPDATE: ユーザーが新しい行を追加して値を選択する行はありません。基本的には、データベースからコンボと塗りつぶし値を表示したいのですが、塗りつぶし値は条件に依存するため、新しい値が来るたびに、

サンプルデータ

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

column1 に 1 から 9 までの値を持つコンボを 1 つ追加しました。ID を_mFillSieveSizeGridComboSQL Server 2008 に渡し、Combo.Item.Add(x)メソッドを使用してコンボを埋めています。

4

3 に答える 3

2

SetCurrentCellAddressCore()の内部値を破壊する再入可能な呼び出しを防止するフラグが内部にありますDataGridView。通常、フラグ = 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;
        }
    }
}
于 2015-03-16T09:12:21.767 に答える