TextBox获取输入焦点时自动全选的实现方法
c#开发winform,如何实现textbox获取输入焦点时自动全选?
肯定不少朋友一看就会觉得再容易不过了:给textbox添加gotfocus事件,然后在事件中调用textbox.selectall()不就完事了吗?巢皮一开始也理所当然得这么认为,但要是你试试这么做,你会发现的当你用点击鼠标左键让textbox.获得输入焦点时,里面的文本根本不会全选。
这是why咧?原因是通过鼠标让textbox获得输入焦点时,textbox触发的事件顺序是:mousedown->gotfocus->mouseup,也就是说textbox在鼠标按下的那一刻已经获得了输入焦点,此时可以对文本全选。但郁闷的是,mouseup却会取消textbox的文本选中状态...也就是说文本其实曾经被全选了,但立即又被取消选中(-_-#)
这样也好办啊,那我改在mouseup事件中textbox.selectall()不就成了?这么一改,鼠标左键点击textbox还真的能实现全选,然而新的问题又会发现:当你希望再次左键点击textbox取消全选时,会发现textbox仍然在全选。
根据上述描述,大致可以摸清这样一个逻辑:
1、如果textbox本身未获得焦点,则点击鼠标左键获得焦点后,执行全选。
2、如果textbox本身已经获得焦点,则点击鼠标左键则不再执行全选。
根据上面的逻辑,其实只要在textbox从无输入焦点到获得输入焦点的时,针对鼠标左键点击操作才做一次全选,否则不做全选操作,因此可以用一个变量作为textbox从无输入焦点到获得输入焦点的标记,当鼠标左键点击判断到这个标记存在时,执行一次全选操作,并把这个标记取消,这样就可以实现上述逻辑了。
下面的代码使用textbox.tag来作为获得输入焦点标记,实现上述自动全选逻辑引用内容
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)
{
//如果鼠标左键操作并且标记存在,则执行全选
if (e.button == mousebuttons.left && (bool)textbox.tag == true)
{
textbox.selectall();
}
//取消全选标记
textbox.tag = false;
}
void textbox_gotfocus(object sender, eventargs e)
{
textbox.tag = true; //设置标记
textbox.selectall(); //注意1
}
值得提出的是,虽然mouseup事件已经执行了全选,但代码中的“注意1”位置,gotfocus事件中我们还是要再执行一次全选,原因是让textbox获得焦点的方法,除了通过鼠标点击,还可能通过tab切换焦点实现的,此时就不会触发mouseup,但也因此不会有被mouseup取消全选的问题,因此在gotfocus事件中还是有必要执行一次全选。
上一篇: 天龙八部里面带头大哥是谁?
下一篇: 莫文蔚冯德伦分手原因是什么!