覆盖Text和OnKeyUp / OnKeyPress

时间:2013-01-15 11:35:29

标签: c# winforms textbox override

我遇到问题,我创建了一个继承自TextBox的自定义控件,我需要覆盖Text属性以及OnKeyPressOnKeyUp事件。

  • 正在覆盖text属性以显示与文本框的实际值不同的值(对于单位转换)
  • 我正在尝试添加的OnKeyPress / OnKeyUp只允许输入数值。

当触发KeyPress事件时,更新的文本是base.Text而不是我的覆盖...有关我如何克服此问题的任何想法?

    public override string Text
    {
        get
        {
            return base.Text;
        }
        set
        {
            displayValue = parse;
            base.Text = this.ContainsFocus ? displayValue.ToString() : displayValue.ToString("N3");
        }
    }
    protected override void OnKeyUp(KeyEventArgs e)
    {
        e.Handled = true;
        if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
            (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
            e.KeyCode == Keys.Decimal)
        {
            e.Handled = false;
        }
        //Code to only accept numerical buttons
        base.OnKeyUp(e);
    }

4 个答案:

答案 0 :(得分:2)

最终需要的是

protected override void OnKeyPress(KeyPressEventArgs e)
{....
    base.OnKeyPress(e);
    Text = base.Text;
 }

我意识到这种情况的原因是base.OnKeyPress(e)必须处理base.Text,这意味着它无法知道我的覆盖

答案 1 :(得分:1)

尝试更改OnKeyUp

 protected override void OnKeyUp(KeyEventArgs e)
    {       
        if ((e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9) ||
            (e.KeyCode >= Keys.NumPad0 && e.KeyCode <= Keys.NumPad9) ||
            e.KeyCode == Keys.Decimal)
        {
             e.Handled = false;
             base.OnKeyUp(e);
        }
        else
        {
             e.Handled= true;
        }       

    }

编辑:改为使用KeyPress

 protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (Char.IsDigit(e.KeyChar))
            {
                e.Handled = false;
                base.OnKeyPress(e);
            }
            else
            {
                e.Handled = true;
            }

        }

答案 2 :(得分:0)

尝试覆盖AppendText属性。

public void AppendText(string text)
    Member of System.Windows.Forms.TextBoxBase

答案 3 :(得分:0)

试一试

  protected override void OnKeyPress(KeyPressEventArgs e)
        {
             if (!char.IsControl(e.KeyChar)
                         && !char.IsDigit(e.KeyChar))
                    e.Handled = true;
            base.OnKeyPress(e);
         }