2011-08-15 8 views
0

RowValidatingイベントを使用すると正常に動作します。DataGridView RowValidatingは、別のコントロールを選択した後に発生します。回避策はありますか?

しかし、行を変更せずにdatagridviewのどこかをクリックすると、別のcontorlを選択した後にイベントが常に発生します。

サンプル-1(正しい):

 
Selecting a Row -> Selecting a Textbox -> Selecting antoher Row 
              |->RowValidating raised 

サンプル-2(間違った):

 
Selecting a Row -> Clicking the Columnheader -> Selecting a Textbox -> Selecting antoher Row 
               |->RowValidating raised |->RowValidating raised 

サンプル-3(間違った):

 
Selecting a Row -> Clicking empty Area -> Selecting a Textbox -> Selecting antoher Row 
              |->RowValidating raised |->RowValidating raised 

行が実際に変更される前にRowInvalidatingを取得する方法はありますか?

私は既にSetSelectedRowCoreを無効にしようとしましたが、選択の変更を取り消すことができましたが、SetSelectedRowCoreが実行される前にデータグリッドビューはEndEdit()をバインディングに送信します。

答えて

0

私は少し汚れの回避策を見つけた:

private void dataGridView_RowValidating(object sender, DataGridViewCellCancelEventArgs e) { 
     Point pos = dataGridView.PointToClient(Control.MousePosition); 
     DataGridView.HitTestInfo hi = dataGridView.HitTest(pos.X, pos.Y); 
     if (hi.Type == DataGridViewHitTestType.Cell && hi.RowIndex != e.RowIndex) { 
      e.Cancel = !AllowChangeCurrent(); //Check if changing selection is allowed 
     } 
    } 

まず私はDataGridViewの中に現在のマウス位置を取得します。

その後、セルがクリックされたかどうかを確認します。 (False - > Finished | True - > Validate)

少なくとも、私はクリックしたセル/行が現在のものではないかどうかを確認します。
関連する問題