TextBox獲取輸入焦點時自動全選的實現(xiàn)方法
C#開發(fā)WinForm,如何實現(xiàn)TextBox獲取輸入焦點時自動全選?
肯定不少朋友一看就會覺得再容易不過了:給TextBox添加GotFocus事件,然后在事件中調(diào)用TextBox.SelectAll()不就完事了嗎?巢皮一開始也理所當然得這么認為,但要是你試試這么做,你會發(fā)現(xiàn)的當你用點擊鼠標左鍵讓TextBox.獲得輸入焦點時,里面的文本根本不會全選。
這是why咧?原因是通過鼠標讓TextBox獲得輸入焦點時,TextBox觸發(fā)的事件順序是:MouseDown->GotFocus->MouseUp,也就是說TextBox在鼠標按下的那一刻已經(jīng)獲得了輸入焦點,此時可以對文本全選。但郁悶的是,MouseUp卻會取消TextBox的文本選中狀態(tài)...也就是說文本其實曾經(jīng)被全選了,但立即又被取消選中(-_-#)
這樣也好辦啊,那我改在MouseUp事件中TextBox.SelectAll()不就成了?這么一改,鼠標左鍵點擊TextBox還真的能實現(xiàn)全選,然而新的問題又會發(fā)現(xiàn):當你希望再次左鍵點擊TextBox取消全選時,會發(fā)現(xiàn)TextBox仍然在全選。
根據(jù)上述描述,大致可以摸清這樣一個邏輯:
1、如果TextBox本身未獲得焦點,則點擊鼠標左鍵獲得焦點后,執(zhí)行全選。
2、如果TextBox本身已經(jīng)獲得焦點,則點擊鼠標左鍵則不再執(zhí)行全選。
根據(jù)上面的邏輯,其實只要在TextBox從無輸入焦點到獲得輸入焦點的時,針對鼠標左鍵點擊操作才做一次全選,否則不做全選操作,因此可以用一個變量作為TextBox從無輸入焦點到獲得輸入焦點的標記,當鼠標左鍵點擊判斷到這個標記存在時,執(zhí)行一次全選操作,并把這個標記取消,這樣就可以實現(xiàn)上述邏輯了。
下面的代碼使用TextBox.Tag來作為獲得輸入焦點標記,實現(xiàn)上述自動全選邏輯引用內(nèi)容
public Form1()
{
InitializeComponent();
textBox.Text = "Auto Select Text Demo";
textBox.Tag = false;
textBox.GotFocus += new EventHandler(textBox_GotFocus);
textBox.MouseUp += new MouseEventHandler(textBox_MouseUp);
}
void textBox_MouseUp(object sender, MouseEventArgs e)
{
//如果鼠標左鍵操作并且標記存在,則執(zhí)行全選
if (e.Button == MouseButtons.Left && (bool)textBox.Tag == true)
{
textBox.SelectAll();
}
//取消全選標記
textBox.Tag = false;
}
void textBox_GotFocus(object sender, EventArgs e)
{
textBox.Tag = true; //設(shè)置標記
textBox.SelectAll(); //注意1
}
值得提出的是,雖然MouseUp事件已經(jīng)執(zhí)行了全選,但代碼中的“注意1”位置,GotFocus事件中我們還是要再執(zhí)行一次全選,原因是讓TextBox獲得焦點的方法,除了通過鼠標點擊,還可能通過Tab切換焦點實現(xiàn)的,此時就不會觸發(fā)MouseUp,但也因此不會有被MouseUp取消全選的問題,因此在GotFocus事件中還是有必要執(zhí)行一次全選。
相關(guān)文章
C# 中的動態(tài)創(chuàng)建組件(屬性及事件)的實現(xiàn)思路及方法
這篇文章主要介紹了C# 中的動態(tài)創(chuàng)建組件,有需要的朋友可以參考一下2013-12-12