因为我在写程序遇到一个问题,所以自己写了一个简单的测试。
加入两个文本框,添加得到焦点的事件。然后分别设置textBox1,textBox2的TabIndex为1和2,
private void textBox1_Enter(object sender, EventArgs e)
        {
            string str = "";
        }private void textBox2_Enter(object sender, EventArgs e)
        {
            string str = "";
            textBox1.Focus();
        }
运行程序,默认textBox1得到的焦点,当我按Tab时直接用鼠标单击textBox2时,按道理代码执行过程是
textBox2_Enter()--textBox1_Enter()--结束,但是当按Tab时,textBox1_Enter()会连续执行两次;当用鼠标单击textBox2执行过程更复杂,textBox2_Enter--textBox1_Enter--textBox1_Enter--textBox2_Enter--textBox1_Enter--textBox1_Enter--结束
为什么会这样,我希望是textBox2_Enter()--textBox1_Enter()--结束  就行了啊,,

解决方案 »

  1.   

    TabIndex为1和2 把它干点试试。
      

  2.   

    我就是为了这个效果,按Tab时让textBox得到焦点,重点他们的执行过程超过了我的想像
      

  3.   

    你使用的是TextBox的Enter事件,而又使用了Focus()方法,默认焦点和你tab后的结果是两次。
      

  4.   

    当程序开始时默认焦点那一次不算,我是说的当按下tab键或单击之后的执行过程,
      

  5.   

    这个这么一个文本框焦点问题没得人遇到啊,,其它就那两行代码,大家试一哈嘛,试了才你就知道我为什么要来csdn了
      

  6.   

    textBox1_Enter是什么控件事件?我怎么没有呢?
      

  7.   

    这个跟Winform的.NET框架有关,微软肯定知道,嘿嘿。
      

  8.   

    Enter事件:在控件成为窗体的活动控件时发生也就是说,当你的焦点锁定到任何一个textbox时都会触发这个控件下的对应方法 private void textBox1_Enter(object sender, EventArgs e)
            {
                //默认焦点,所以我活动(第1次)
                MessageBox.Show("因为焦点在,所以我活动");
                
            }        private void textBox2_Enter(object sender, EventArgs e)
            {
                MessageBox.Show("因为焦点在,所以我活动");
                textBox1.Focus();//TODO:TabIndex=1的是否活动?答案Yes!那我继续活动一次(第2次)
            }
      

  9.   


    应该是触发三次private void textBox1_Enter(object sender, EventArgs e)
            {
                //默认焦点,所以我活动(第1次)
                MessageBox.Show("因为焦点在,所以我活动");
                
            }        private void textBox2_Enter(object sender, EventArgs e)
            {
                MessageBox.Show("因为焦点在,所以我活动");//第2次
                textBox1.Focus();//TODO:TabIndex=1的是否活动?答案Yes!那我继续活动一次(第3次)
            }如果你要实现你的功能,那么你的事件就选错了,KeyDown或许可以
      

  10.   

    楼上的你照着拖两控件试一下嘛,默认焦点不算,程序启动执行textBox1_Enter不算,我是说的当按Tab或单击textBox2时所执行的过程,,
      

  11.   

    我必须要在Enter事件完成,并且我封装了回车时焦点自动跳下一控件.
      

  12.   

    想实现这个功能的话下面这样就行了,textbox_enter貌似不是回车事件哦
     private void Form1_KeyUp(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter)
                {
                    if (ActiveControl != null)
                    {
                        this.SelectNextControl(this.ActiveControl, true, true, true, true);                   
                    }
                }      
            }
      

  13.   

    这些我知道,我是要在Enter事件完成其它的事,现在我的问题是Enter事件为什么会连续执行两次,,
      

  14.   

     当通过使用键盘(Tab、Shift+Tab 等)、通过调用 Select 或 SelectNextControl 方法或者通过将 ContainerControl.ActiveControl 属性设置为当前窗体等方式更改焦点时,焦点事件按以下顺序发生:    Enter    GotFocus    Leave    Validating    Validated    LostFocus当使用鼠标或通过调用 Focus 方法更改焦点时,焦点事件将按以下顺序发生:    Enter    GotFocus    LostFocus    Leave    Validating    Validatedmsdn上解释,你在textBox1.Focus();就已经先执行了Enter事件,再执行GotFocus事件,这时textBox又执行了Enter事件才完毕。
      

  15.   

    那为什么我在按钮的单击事件中写textBox1.Focus();就会正常的执行一次呢
      

  16.   

    详细请看这个http://msdn.microsoft.com/zh-cn/library/system.windows.forms.control.enter.aspx,它是Control.Enter 事件而不是Control.Click事件里
      

  17.   

    别用Enter事件。
    用别的事件
      

  18.   

    本来我是写一组输入控件的一个集合,里面有文本框,时间控件,选择控件(可以输入编号及拼音码选择该项目)等各种控件,然后像网格一样排开,里面每一个控件元素都有一个文本框,里面我就重写了控件元素的Enter和Leave事件,(因为是控件,这个是暴露给后面使用控件的开发者)。我就需要在下一个Enter时去检测上一控件输入的数据是否合要求(像输入的编号没有,或者时间格式不对等),,如果不对,焦点回到上一控件,并且这时我自己重写的Enter和Leave是不触发的。关键就在焦点回到上一控件,多次执行了上一控件的文本框的Enter事件,里面还有很复杂的逻辑都被打乱了,
      

  19.   

     
    private void textBox2_Enter(object sender, EventArgs e)
            {
                if (a)
                    return;
                OutputDebugString("2");
            }
            
            static bool a = false;
            static bool b = false;
            private void textBox3_Enter(object sender, EventArgs e)
            {
                OutputDebugString("3");
                a = true;
                textBox2.Focus();
                a = false;
            }
      

  20.   

    因为点击的时候鼠标点击的时候会触发两次enter事件。
    这个是捕捉不到的
    只能判断时间间隔
      

  21.   

    按tab   结果是    32点击    结果是    3232
      

  22.   

    你这个不现实,因为是控件,所以要考虑的事情很多,有可能是单击、按键、Focus都能触发该事件,并且他们执行过程全都不一样,我想的如果还有更好的办法就只有用timer来延迟一毫秒让timer事件中来调用Focus
      

  23.   

    用焦点离开事件
    离开的时候判断
    编号时间等等
    然后再判断要不要textBox1.Select();
      

  24.   

    我比较好奇的是这个文本框既然不能获得焦点那你放在在画面上干嘛?
    这种诡异的需求的目的是?
    如果只是不想tab到textbox上,直接tabstop属性就可以
      

  25.   

    估计这个Enter事件是比较低级的,使用这种事件容易有出乎意料的效果。尽量避免使用。有空测试一下
      

  26.   

    不用textBox1.Focus();
    改用textBox1.Select();好像同样能得到聚焦的效果,但没有副作用。
      

  27.   

    不好意思,搞错了。看来用了Enter事件就不能再用Focus()或者Select(),如果有这个需求,应该考虑用其他事件。