日期:2014-05-18  浏览次数:20714 次

关于设置输入焦点的问题
前两个星期测试我写的mobile应用程序,发现一个严重的Bug.有一个对象在传值过程中被突然丢失了.研究了两个星期,没有去解决这个问题,因为这个问题据我所想的,有两种解法.所以这个星期写了一例子,来研究这个问题产生的原因.
在启动窗体里面写的代码
private Form3 objfrm3 = null;
private void button4_Click(object sender, EventArgs e)
  {
  if ( objfrm3 == null )
  {
  objfrm3 = new Form3();
  }
  objfrm3.Owner = this;
  //objfrm3.WhichOne = 400;
  objfrm3.ShowDialog();
  }

在Form3里面写的代码
private void textBox1_GotFocus(object sender, EventArgs e)
  {
  Debug.WriteLine("Box1");
  }

  private void textBox2_GotFocus(object sender, EventArgs e)
  {
  Debug.WriteLine( "Box2" ); }

  private void Form3_Load(object sender, EventArgs e)
  {
  Debug.WriteLine("Load");
  this.Show();
  this.textBox1.Focus();
  }

  private void textBox1_LostFocus(object sender, EventArgs e)
  {
  Debug.WriteLine("Box1 leave");
  }

  private void textBox2_LostFocus(object sender, EventArgs e)
  {
  Debug.WriteLine( "Box2 leave" );
  }

动作如下,运行程序,单击Button4
打印了:
Load
Box1
然后单击了TextBox2
打印了:
Box1 leave
Box2
Form3右上角的ok,关闭了Form3
打印了:
Box2 leave
再次单击Button4
打印了:
Load
Box2
Box2 leave
Box1
问题就在这里,为什么textBox2_GotFocus要先被调用?

------解决方案--------------------
抢沙发,帮顶顶
------解决方案--------------------
是不是两个textbox的tabindex反了?box2的tabindex比box1的小 所以先把焦点给了box2,然后你再box.focus(),再把焦点给了box1
------解决方案--------------------
我估计是这样的,
你的form3只创建一次实例,第一次关掉后,最后焦点是在textbox2上的,关掉form3,当然textbox2失去焦点,这是自动的,而不是人为改变活动控件
你再次打开form3,最后焦点是在textbox2上的,所以打开form3的时候,它直接得到焦点.但你的textbox1的tabindex肯定最小,默认焦点应该落在应该是textbox1上,于是,系统重新把焦点给了textbox1
------解决方案--------------------
在form2的formclosing事件里加上textbox1.focus();就可以了 似乎是像都上说的那样
------解决方案--------------------
很经典的代码 
http://blog.csdn.net/chinahuyong