2017-04-20 32 views
1

ContexMenuStripを使用して一部の行を削除しても、正しく動作しません。チェックされたセルの後にDataGridViewの編集を停止する方法は?

3行をチェックすると、ContexMenuStripを選択するたびに2行だけが削除されます。私がContexMenuStripButtonによる)を使わずにこのコードを実行すると、正しく動作します。

私は現在の行が編集されていますが、完了していないことを理解している動作を見ます。現在の行をダブルクリックして編集を終了すると、ContexMenuStripが正しく動作します。 CheckBoxを確認した後、編集を停止する方法

Row in edit mode

答えて

1

セルを選択して編集すると、DataGridViewプロパティIsCurrentCellDirtyTrueに設定されます。この状態がDataGridViewCheckBoxCellに変更されたときにイベントハンドラをキャッチした場合は、DataGridView.EndEdit()に電話して直ちに変更を確定することができます。

this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_CurrentCellDirtyStateChanged; 

private void DataGridView1_CurrentCellDirtyStateChanged(object sender, EventArgs e) 
{ 
    if (this.dataGridView1.IsCurrentCellDirty && this.dataGridView1.CurrentCell is DataGridViewCheckBoxCell) 
    { 
     this.dataGridView1.EndEdit(); 
    } 
} 

さらなる説明:舞台裏

DataGridView.IsCurrentCellDirtyは、現在のセルを編集するたびに更新されます。上記のコードの最初の行では、CurrentCellDirtyStateChangedイベントに独自のイベントハンドラ(DataGridView1_CurrentCellDirtyStateChanged)を添付することができます。だから、細胞が汚れたときはいつも、舞台裏で基本レベルのイベントが呼び出され、あなたの方法も呼び出されます。その行がなければ、あなたのメソッドは呼び出されません。 +=オペレータは、がイベントのコールチェーンにメソッドをアタッチするものです。例えば

、次のハンドラを追加:

this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_Example1; 
// this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_Example2; 
this.dataGridView1.CurrentCellDirtyStateChanged += DataGridView1_Example3; 

private void DataGridView1_Example1(object sender, EventArgs e) 
{ 
    Console.WriteLine("Example 1"); 
} 

private void DataGridView1_Example2(object sender, EventArgs e) 
{ 
    Console.WriteLine("Example 2"); 
} 

private void DataGridView1_Example3(object sender, EventArgs e) 
{ 
    Console.WriteLine("Example 3"); 
} 

をすると汚れの状態が変化し、次のような出力が表示されます。第二イベントハンドラが除外された注意してください:

// Example 1 
// Example 3 
+0

私はあなたのコードを使用して、私は、の必要性を理解してはいけない.butそれが正しく動作{this.dataGridView1.CurrentCellDirtyStateChanged + = DataGridView1_CurrentCellDirtyStateChangedを;} – saeid

関連する問題