重写文本和OnKeyUp/OnKeyPress

本文关键字:OnKeyPress OnKeyUp 文本 重写 | 更新日期: 2023-09-27 17:53:07

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

  • 文本属性被重写以显示与文本框的实际值不同的值(用于单位转换)
  • 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);
    }

重写文本和OnKeyUp/OnKeyPress

最后只需要

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

我意识到这种情况的原因是base. onkeypress (e)必须处理base。文本这意味着它无法知道我的重写

试着改变你的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;
        }       
    }

EDIT:KeyPress代替:

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

试一试

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

尝试覆盖AppendText属性。

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