TextBox和DataGridView控件的事件发生顺序
今天在編寫代碼的時候碰到了控件的驗證問題。
命題:在前臺的DataGridView中,任意行的單元格都不能為空,也就是說,在編寫的過程中,某一行的編輯完成之后,需要驗證各單元是否為空。
事件綁定:最開始編寫的時候,我調用了dgvDetail.RowLeave事件。發(fā)現(xiàn)每次鼠標移到其他行的時候,最后一個編寫的單元數(shù)據(jù)還沒有寫入之前就開始執(zhí)行RowLeave事件了。也就是說,用戶已經填寫了數(shù)據(jù),但是在數(shù)據(jù)寫入控件之間就先執(zhí)行驗證事件了。這樣的操作過程對用戶來講是非常不友好的。
然后我做了一個調整,將驗證事件綁在了dgvDetail.RowValidated上。
隨后我做了一個控件事件的發(fā)生順序以及賦值情況的測試。
測試對象:TextBox、DataGridView.前臺窗口如下:
后臺代碼如下:
public partial class TestEvent : Form {string txtEventStr = "", dgvEventStr = "";int txtI = 0, dgvI = 0;public TestEvent(){InitializeComponent();Action<string> txtAdd = txt =>{txtI++;txtEventStr += string.Format("\r\n{0}:{1}, Text = {2}", txtI, txt, txtEventTest.Text);};Action<string> dgvStrAdd = txt =>{dgvI++;dgvEventStr += string.Format("\r\n{0}:{1}, Text = {2}", dgvI, txt, dgv[0, 0].Value);};txtEventTest.Validated += (a, b) => txtAdd("Validated");txtEventTest.Validating += (a, b) => txtAdd("Validating");txtEventTest.Leave += (a, b) => txtAdd("Leave");txtEventTest.LostFocus += (a, b) => txtAdd("LostFocus");txtEventTest.GotFocus += (a, b) => txtAdd("GotFocus");txtEventTest.Enter += (a, b) => txtAdd("Enter");btnTxtEvent.Click += (a, b) => MessageBox.Show(txtEventStr);dgv.RowEnter += (a, b) => dgvStrAdd("RowEnter");dgv.RowValidated += (a, b) => dgvStrAdd("RowValidated");dgv.RowValidating += (a, b) => dgvStrAdd("RowValidating");dgv.RowLeave += (a, b) => dgvStrAdd("RowLeave");btnDGVEvent.Click += (a, b) => MessageBox.Show(dgvEventStr);} }?前臺操作:
鼠標點擊textbox => 輸入文字 => 點擊按鈕btnTxtEvent。
鼠標點擊dgv的[0,0]單元??=> 輸入文字 => 點擊按鈕btnDGVEvent。
執(zhí)行結果:
??
根據(jù)最后的執(zhí)行結果,我們可以清晰的看到textBox的事件執(zhí)行順序為Enter、GotFocus、LostFocus、Leave、Validating、Validated,也就是說程序先“進入”控件,然后控件“得到焦點”,緊接著控件“失去焦點”,此時前臺輸入的值已經寫入控件屬性,然后“離開”控件,開始“校驗”,最后發(fā)生“校驗完”事件。
而DataGridView的行事件執(zhí)行順序為RowEnter、RowLeave、RowValidating、RowValidated,順序與textBox的事件執(zhí)行順序可以說一致,但有一個很大的區(qū)別,前臺輸入值寫入控件的時間。相較于textbox在Leave事件之前就寫入,DataGridView卻是在RowLeave事件之后才寫入控件的屬性。因此,回到最開始的命題中,才會導致那樣不友好的操作結果。
以上內容為筆者親著,轉發(fā)請注明本文地址:
http://www.cnblogs.com/icyJ/archive/2012/10/29/Event_Order.html
轉載于:https://www.cnblogs.com/icyJ/archive/2012/10/29/Event_Order.html
總結
以上是生活随笔為你收集整理的TextBox和DataGridView控件的事件发生顺序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySql隔离级别多线程并发读取数据时的
- 下一篇: DataGridView 的 Curre