zoukankan      html  css  js  c++  java
  • 【转】实现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来作为获得输入焦点标记,实现上述自动全选逻辑引用内容       

       

    View Code
     1  public Form1()         
     2  {              
     3         InitializeComponent();
     4         textBox.Text = "Auto Select Text Demo";              
     5         textBox.Tag = false;              
     6         textBox.GotFocus += new EventHandler(textBox_GotFocus);              
     7         textBox.MouseUp += new MouseEventHandler(textBox_MouseUp);         
     8 
     9 }
    10        
    11  void textBox_MouseUp(object sender, MouseEventArgs e)         
    12 {             
    13         //如果鼠标左键操作并且标记存在,则执行全选             
    14       if (e.Button == MouseButtons.Left && (bool)textBox.Tag == true)            
    15         {                  
    16                 textBox.SelectAll();             
    17         }
    18             
    19        //取消全选标记              
    20      textBox.Tag = false;         
    21 }
    22         
    23 
    24 void textBox_GotFocus(object sender, EventArgs e)        
    25  {              
    26            textBox.Tag = true;    //设置标记              
    27         textBox.SelectAll();   //注意1         
    28 }

      值得提出的是,虽然MouseUp事件已经执行了全选,但代码中的“注意1”位置,GotFocus事件中我们还是要再执行一次全选,原因是让TextBox获得焦点的方法,除了通过鼠标点击,还可能通过Tab切换焦点实现的,此时就不会触发MouseUp,但也因此不会有被MouseUp取消全选的问题,因此在GotFocus事件中还是有必要执行一次全选。

    引用自:: http://www.febotion.com/blog/trackback.asp?tbID=253&action=addtb&tbKey=bce5acda9d935f1509e7b4117b0688ede122935b

  • 相关阅读:
    C#获取上级文件夹路径
    C#string与byte数组转行
    C#BAT与VBS文件的创建和执行调用
    C#生成条形码
    C#根据生日计算所属十二星座
    C#获取某一字符串第N到第N+1空格的字符
    WPF的DataGrid表格动态加载合并列
    WPF递归设置CheckBox与TextBox禁用联动
    WPF基础知识
    WPF Popup绑定目标控件上下左右位置
  • 原文地址:https://www.cnblogs.com/sishierfei/p/2949501.html
Copyright © 2011-2022 走看看