2017-04-20 138 views
1

我使用ContexMenuStripDataGridView刪除一些行,但它不能正常工作。如何在選中單元格後停止DataGridView編輯?

每次檢查3行,選擇ContexMenuStrip後,它只會刪除2行。當我做這個代碼沒有ContexMenuStrip(通過Button),正常工作。

當我看到行爲時,我明白當前行正在編輯但未完成。雙擊當前行停止編輯我的ContexMenuStrip正常工作。

Row in edit mode

檢查CheckBox後如何停止編輯?

回答

1

當一個單元格被選中並編輯後,DataGridView屬性IsCurrentCellDirty被設置爲True。如果在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是每當編輯當前單元格更新。上面的第一行代碼允許您將自己的事件處理程序(DataGridView1_CurrentCellDirtyStateChanged)附加到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

我用你的代碼,它能夠正常工作。但我不明白需要{this.dataGridView1.CurrentCellDirtyStateChanged + = DataGridView1_CurrentCellDirtyStateChanged;} – saeid

相關問題