對於DataGridView控件,與單元格內容相關的有以下這幾個事件:
<span style="font-size:18px;">// 當單元格內容改變並且提交之後發生(提交一般是單元格在編輯完之後失去焦點)
private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
}
// 當單元格進入編輯狀態時發生
private void dataGridView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
{
}
// 在單元格的狀態相對於其內容的更改而更改時發生。
private void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
}
// 在單元格完成編輯時發生
private void dataGridView_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
}</span>
但是以上這幾個事件都不能實現每次向單元格輸入新的內容時發生。舉個例子,我單擊一個單元格,則單元格進入編輯狀態,CellBeginEdit事件發生,然後我輸入1,2……乃至更多的東西,上述的事件也不會發生。另外Key*系列的事件也試過,也沒反應。
如果要像TextBox那樣,每輸入一個字符就發生一次的事件怎麼辦呢?可以用以下方法。原來dataGridView控件的單元格只是個容器,他可以容納其他的控件,最一般的就是一個文本框。EditingControlShowing事件比上述事件還要早發生,他是dataGridView控件爲了使用戶可以編輯,而加載一個TextBox(如果單元格時複選框,是其他的控件,那麼就加載對應的控件),加載TextBox時這個事件發生,可以在時間參數中獲取這個TextBox的引用,動態註冊一個事件即可。
<span style="font-size:18px;">// 當dataGridView控件加載一個子控件用於編輯時發生。
private void dataGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
TextBox EditingTB = e.Control as TextBox; // 獲取編輯用的文本框的引用
EditingTB.TextChanged += EditingTB_TextChanged; // 動態註冊事件
}
// 當子控件的內容更改時發生
private void EditingTB_TextChanged(object sender, EventArgs e)
{
String nowstr = (sender as TextBox).Text;
}</span>
要注意一點,這裏的EditingTB應該保存下來,然後在CellEndEdit事件中註銷事件。