TextBox獲取輸入焦點(diǎn)時(shí)自動(dòng)全選的實(shí)現(xiàn)方法
C#開(kāi)發(fā)WinForm,如何實(shí)現(xiàn)TextBox獲取輸入焦點(diǎn)時(shí)自動(dòng)全選?
肯定不少朋友一看就會(huì)覺(jué)得再容易不過(guò)了:給TextBox添加GotFocus事件,然后在事件中調(diào)用TextBox.SelectAll()不就完事了嗎?巢皮一開(kāi)始也理所當(dāng)然得這么認(rèn)為,但要是你試試這么做,你會(huì)發(fā)現(xiàn)的當(dāng)你用點(diǎn)擊鼠標(biāo)左鍵讓TextBox.獲得輸入焦點(diǎn)時(shí),里面的文本根本不會(huì)全選。
這是why咧?原因是通過(guò)鼠標(biāo)讓TextBox獲得輸入焦點(diǎn)時(shí),TextBox觸發(fā)的事件順序是:MouseDown->GotFocus->MouseUp,也就是說(shuō)TextBox在鼠標(biāo)按下的那一刻已經(jīng)獲得了輸入焦點(diǎn),此時(shí)可以對(duì)文本全選。但郁悶的是,MouseUp卻會(huì)取消TextBox的文本選中狀態(tài)...也就是說(shuō)文本其實(shí)曾經(jīng)被全選了,但立即又被取消選中(-_-#)
這樣也好辦啊,那我改在MouseUp事件中TextBox.SelectAll()不就成了?這么一改,鼠標(biāo)左鍵點(diǎn)擊TextBox還真的能實(shí)現(xiàn)全選,然而新的問(wèn)題又會(huì)發(fā)現(xiàn):當(dāng)你希望再次左鍵點(diǎn)擊TextBox取消全選時(shí),會(huì)發(fā)現(xiàn)TextBox仍然在全選。
根據(jù)上述描述,大致可以摸清這樣一個(gè)邏輯:
1、如果TextBox本身未獲得焦點(diǎn),則點(diǎn)擊鼠標(biāo)左鍵獲得焦點(diǎn)后,執(zhí)行全選。
2、如果TextBox本身已經(jīng)獲得焦點(diǎn),則點(diǎn)擊鼠標(biāo)左鍵則不再執(zhí)行全選。
根據(jù)上面的邏輯,其實(shí)只要在TextBox從無(wú)輸入焦點(diǎn)到獲得輸入焦點(diǎn)的時(shí),針對(duì)鼠標(biāo)左鍵點(diǎn)擊操作才做一次全選,否則不做全選操作,因此可以用一個(gè)變量作為TextBox從無(wú)輸入焦點(diǎn)到獲得輸入焦點(diǎn)的標(biāo)記,當(dāng)鼠標(biāo)左鍵點(diǎn)擊判斷到這個(gè)標(biāo)記存在時(shí),執(zhí)行一次全選操作,并把這個(gè)標(biāo)記取消,這樣就可以實(shí)現(xiàn)上述邏輯了。
下面的代碼使用TextBox.Tag來(lái)作為獲得輸入焦點(diǎn)標(biāo)記,實(shí)現(xiàn)上述自動(dòng)全選邏輯引用內(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)
{
//如果鼠標(biāo)左鍵操作并且標(biāo)記存在,則執(zhí)行全選
if (e.Button == MouseButtons.Left && (bool)textBox.Tag == true)
{
textBox.SelectAll();
}
//取消全選標(biāo)記
textBox.Tag = false;
}
void textBox_GotFocus(object sender, EventArgs e)
{
textBox.Tag = true; //設(shè)置標(biāo)記
textBox.SelectAll(); //注意1
}
值得提出的是,雖然MouseUp事件已經(jīng)執(zhí)行了全選,但代碼中的“注意1”位置,GotFocus事件中我們還是要再執(zhí)行一次全選,原因是讓TextBox獲得焦點(diǎn)的方法,除了通過(guò)鼠標(biāo)點(diǎn)擊,還可能通過(guò)Tab切換焦點(diǎn)實(shí)現(xiàn)的,此時(shí)就不會(huì)觸發(fā)MouseUp,但也因此不會(huì)有被MouseUp取消全選的問(wèn)題,因此在GotFocus事件中還是有必要執(zhí)行一次全選。
相關(guān)文章
C#實(shí)現(xiàn)PDF頁(yè)面合并的示例代碼
這篇文章主要為大家介紹了如何利用C#及vb.net來(lái)實(shí)現(xiàn)合并PDF頁(yè)面內(nèi)容,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定幫助,感興趣的小伙伴可以了解一下2022-04-04
C#鉤子Hook監(jiān)聽(tīng)鍵盤鼠標(biāo)事件實(shí)現(xiàn)窗體自動(dòng)關(guān)閉
鉤子(Hook)的作用主要體現(xiàn)在監(jiān)視和攔截系統(tǒng)或進(jìn)程中的各種事件消息,并進(jìn)行自定義處理,本文主要介紹了C#如何利用鉤子Hook監(jiān)聽(tīng)鍵盤鼠標(biāo)事件實(shí)現(xiàn)窗體自動(dòng)關(guān)閉功能,感興趣的可以了解下2025-01-01
C#?委托與?Lambda?表達(dá)式轉(zhuǎn)換機(jī)制及弱事件模式下的生命周期詳解
本文介紹了C#委托和Lambda表達(dá)式的工作原理,包括委托的內(nèi)部結(jié)構(gòu)、Lambda表達(dá)式的轉(zhuǎn)換機(jī)制以及弱事件模式下的生命周期管理,感興趣的朋友一起看看吧2025-02-02
c# 通過(guò)wbemtest和WMI Code Cretor更加高效的訪問(wèn)WMI
能找到這篇博客的,相信都是有操作WMI需求的了。本文將講述如何快速驗(yàn)證、并集成到C#來(lái)操作WMI。2021-05-05
基于WPF繪制一個(gè)點(diǎn)贊大拇指動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了WPF實(shí)現(xiàn)繪制一個(gè)點(diǎn)贊大拇指動(dòng)畫,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定幫助,感興趣的小伙伴可以了解一下2023-02-02
C# 如何實(shí)現(xiàn)一個(gè)帶通知的List<T>
這篇文章主要介紹了C# 如何實(shí)現(xiàn)一個(gè)帶通知的List<T>,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-02-02
C#使用ffmpeg實(shí)現(xiàn)將圖片保存為mp4視頻
FFmpeg是一個(gè)開(kāi)源的跨平臺(tái)多媒體處理工具,它提供了強(qiáng)大的功能,包括頻和視頻編碼、解碼、轉(zhuǎn)碼等,本文我們將使用FFmpeg實(shí)現(xiàn)將圖片保存為mp4視頻,感興趣的可以了解下2024-11-11

