【转】实现TextBox获取输入焦点时自动全选
2013-03-08 11:01
351 查看
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来作为获得输入焦点标记,实现上述自动全选逻辑引用内容
View Code
值得提出的是,虽然MouseUp事件已经执行了全选,但代码中的“注意1”位置,GotFocus事件中我们还是要再执行一次全选,原因是让TextBox获得焦点的方法,除了通过鼠标点击,还可能通过Tab切换焦点实现的,此时就不会触发MouseUp,但也因此不会有被MouseUp取消全选的问题,因此在GotFocus事件中还是有必要执行一次全选。
引用自:: http://www.febotion.com/blog/trackback.asp?tbID=253&action=addtb&tbKey=bce5acda9d935f1509e7b4117b0688ede122935b
肯定不少朋友一看就会觉得再容易不过了:给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来作为获得输入焦点标记,实现上述自动全选逻辑引用内容
View Code
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事件中还是有必要执行一次全选。
引用自:: http://www.febotion.com/blog/trackback.asp?tbID=253&action=addtb&tbKey=bce5acda9d935f1509e7b4117b0688ede122935b
相关文章推荐
- TextBox获取输入焦点时自动全选的实现方法
- 如何实现当Form中某textBox成为焦点时,自动打开某输入法(比如说五笔字型)!
- asp.net控件与JavaScript实现TextBox获取焦点时出现日历
- 设置flex应用程序加载完毕后自动获取到输入焦点
- Flex组件自动获取输入焦点
- WPF 之 实现TextBox输入文字后自动弹出数据(类似百度的输入框)
- ASP.NET(C#)中返回textbox焦点并全选所输入的内容
- jQuery实现文本域内提示文字,当鼠标点击进文本域后自动消失,文本域失去鼠标焦点后显示提示文字或显示用户输入的文字。
- 获取inpu焦点,输入完后自动跳到第二个input
- [windows store 学习]ScrollViewer中TextBox自动获取焦点的问题
- Flex组件自动获取输入焦点
- 多个input输入框 限制每个输入框输入一位 输入完成自动获取下一个input焦点
- java实现记事本基本功能:新建、打开、保存、另存为、退出、替换、全部替换、复制、剪切、粘贴、全选、获取当前时间日期、修改字体、颜色、自动换行等
- VC实现对话框置顶并获取键盘输入焦点
- JavaScript实现在textbox输入时自动去数据库匹配并找出类似值列出,选择后记得将值填入本textbox及下一个textbox
- WPF 之 实现TextBox输入文字后自动弹出数据(类似百度的输入框)
- asp.net Textbox获取焦点并且内容全选
- jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后 //获取焦点后光标在字符串后 //其原理就是获得焦点后重新把自己复制粘帖一下 var t=$("#"+id).val()
- 文本框自动获取焦点并提示输入继而恢复