重写一文本控件:
    protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);            if (e.KeyCode == Keys.Down)
            {
                if (this.gridRow == null || this.gridRow.Length == 0) return;
                this.TextChanged -= new EventHandler(GridTextBox_TextChanged);
            }
            else if (e.KeyCode == Keys.Up)
            {
                if (this.gridRow == null || this.gridRow.Length == 0) return;
                this.TextChanged -= new EventHandler(GridTextBox_TextChanged);            }
            else
            {
                this.TextChanged += new EventHandler(GridTextBox_TextChanged);
            }
        }        void GridTextBox_TextChanged(object sender, EventArgs e)
        {
            SetGridDataSource(this.Text);
        }
程序意图是 当按上下键的时候 不要激发GridTextBox_TextChanged 事件 而按其它键的时候激发  但是只能移除一次事件,不知道是为什么?也就是当按上下方向键后按下其它键 再按方向键 事件却没有被移除 是怎么回事哦

解决方案 »

  1.   

    else按键不止Up和Down还有Press等   代码是有点绕
      

  2.   

    应该增加一个bool全局变量,初始值为true,按下上下键时,如果该值为true,则移除事件,按下其他键时,如果为false则增加.private bool add=true;
    protected override void OnKeyDown(KeyEventArgs e)
            {
                base.OnKeyDown(e);            if (e.KeyCode == Keys.Down&&add)
                {
                    if (this.gridRow == null || this.gridRow.Length == 0) return;
                    this.TextChanged -= new EventHandler(GridTextBox_TextChanged);
                    add=false;            }
                else if (e.KeyCode == Keys.Up&&add)
                {
                    if (this.gridRow == null || this.gridRow.Length == 0) return;
                    this.TextChanged -= new EventHandler(GridTextBox_TextChanged);
                    add=false;
                }
                else if(!add)
                {
                    this.TextChanged += new EventHandler(GridTextBox_TextChanged);
                    add=true;
                }
            }        void GridTextBox_TextChanged(object sender, EventArgs e)
            {
                SetGridDataSource(this.Text);
            }
      

  3.   

    按下键 本身就是个判断吧
    流程 按其它键,事件被触发->按↑↓方向键,事件被移除->再按其它键,事件被绑定->再按↑↓方向键,却发现事件没有被移除.SetGridDataSource(this.Text);继续被执行着.