【MARK】C# DataGridView控件單元格 未提交 內容改變事件

對於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事件中註銷事件。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章