写了一个dateTextBox控件,继承TextBox
写法1:
protected override void OnKeyPress(KeyPressEventArgs e)

if ((e.KeyChar=='\b')||((e.KeyChar>='0')&&(e.KeyChar<='9')))
  e.Handled=false;
  else
  e.Handled=true;
}
拖入该控件到窗口中,在其KeyPress事件中写入MessageBox.show("111");执行,但不会有信息提示框出现,也就是改事件中的代码不被执行写法2:
private void dateTextBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)

if ((e.KeyChar=='\b')||((e.KeyChar>='0')&&(e.KeyChar<='9')))
  e.Handled=false;
  else
  e.Handled=true;
}
该段代码是写在控件代码中的,而不是在拖入控件至窗口中写的代码.同样,拖入该控件到窗口中,在其KeyPress事件中写入MessageBox.show("111");执行,但会有信息提示框出现.
窗口中该控件的KeyPress事件响应代码是:
private void dateTextBox1_TextChanged(object sender, System.EventArgs e)
{
MessageBox.Show("1111");
}
问题:为什么会有这样的情况出现,如果按照第一个方法写,怎么才能响应窗口中该控件的KeyPress事件?
高分求解.

解决方案 »

  1.   

    protected override void OnKeyPress(KeyPressEventArgs e)估计问题是在这里.
      

  2.   

    跟这个没关系的.第一个写法就是重写了KeyPress,而第二种就是一个方法,但不知道为什么第二种写法的代码会被执行,难道是因为他的名称就是
    this.dateTextBox1.TextChanged += new System.EventHandler(this.dateTextBox1_TextChanged);
    ??
      

  3.   

    protected override void OnKeyPress(KeyPressEventArgs e)

    if ((e.KeyChar=='\b')||((e.KeyChar>='0')&&(e.KeyChar<='9')))
      e.Handled=false;
      else
      e.Handled=true;
    base.OnKeyPress(e);//加了这一句才会触发基类的事件
    }
    试试
      

  4.   

    因为你没调用基础类的base.OnKeyPress(e)方法,因为触发事件的代码是在基类的方法里面
      

  5.   

    楼上的兄弟,我想看看基类textbox的OnKeyPress或者其他方法的代码,有办法吗?
      

  6.   

    如果想看下基类OnKeyPress的代码,用反译工具反译就可以看到了.
    基类代码可能只是简单事件触发的代码,并不复杂.
    事件模式引用一个虚的OnKeyPress方法来触发事件,可以使后期扩展能够灵活地控制.
      

  7.   

    基类代码大概如下:
    protected virtul void OnKeyPress(KeyPressEventArgs e)

     if(this.KeyPress!=null)
        this.KeyPress(this,e);
    }