2024年4月25日发(作者:)

实现TextBox获取输入焦点时自动全选

2009-12-02 22:08

C#开发WinForm,如何实现TextBox获取输入焦点时自动全选?

肯定不少朋友一看就会觉得再容易不过了:给TextBox添加GotFocus事件,

然后在事件中调用All()不就完事了吗?巢皮一开始也理所当

然得这么认为,但要是你试试这么做,你会发现的当你用点击鼠标左键让

TextBox.获得输入焦点时,里面的文本根本不会全选。

这是why咧?原因是通过鼠标让TextBox获得输入焦点时,TextBox触发的

事件顺序是:MouseDown->GotFocus->MouseUp,也就是说TextBox在鼠标按下的

那一刻已经获得了输入焦点,此时可以对文本全选。但郁闷的是,MouseUp却会

取消TextBox的文本选中状态...也就是说文本其实曾经被全选了,但立即又被

取消选中(-_-#)

这样也好办啊,那我改在MouseUp事件中All()不就成了?

这么一改,鼠标左键点击TextBox还真的能实现全选,然而新的问题又会发现:

当你希望再次左键点击TextBox取消全选时,会发现TextBox仍然在全选。

根据上述描述,大致可以摸清这样一个逻辑:

1、如果TextBox本身未获得焦点,则点击鼠标左键获得焦点后,执行全选。

2、如果TextBox本身已经获得焦点,则点击鼠标左键则不再执行全选。

根据上面的逻辑,其实只要在TextBox从无输入焦点到获得输入焦点的时,

针对鼠标左键点击操作才做一次全选,否则不做全选操作,因此可以用一个变

量作为TextBox从无输入焦点到获得输入焦点的标记,当鼠标左键点击判断到

这个标记存在时,执行一次全选操作,并把这个标记取消,这样就可以实现上述

逻辑了。

下面的代码使用来作为获得输入焦点标记,实现上述自动全选

逻辑

引用内容

public Form1()

{

InitializeComponent();

= "Auto Select Text Demo";

= false;

us += new EventHandler(textBox2_GotFocus);

p += new

MouseEventHandler(textBox2_MouseUp);

}

void textBox2_MouseUp(object sender, MouseEventArgs e)

{

//如果鼠标左键操作并且标记存在,则执行全选

if ( == && (bool) ==

true)

{

All();

}

//取消全选标记

= false;

}

void textBox2_GotFocus(object sender, EventArgs e)

{

= true; //设置标记

All(); //注意1

}

值得提出的是,虽然MouseUp事件已经执行了全选,但代码中的“注意1”

位置,GotFocus事件中我们还是要再执行一次全选,原因是让TextBox获得焦

点的方法,除了通过鼠标点击,还可能通过Tab切换焦点实现的,此时就不会触

发MouseUp,但也因此不会有被MouseUp取消全选的问题,因此在GotFocus事

件中还是有必要执行一次全选。