【问题标题】:Overriding Text and OnKeyUp/OnKeyPress覆盖文本和 OnKeyUp/OnKeyPress
【发布时间】:2023-03-30 00:24:01
【问题描述】:

我有一个问题,我创建了一个从 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);
    }

【问题讨论】:

  • 你设置 e.Handled = true;在 OnKeyUp 中?
  • 我当时什么也没设置,里面唯一的代码是e.KeyCode &gt;= Keys.D0等,编辑:这里显示的base.OnKeyUp(e)
  • @AndreyVoloshin - 我已经更新了我的示例以包含我完整的 onkeyup

标签: c# winforms textbox overriding


【解决方案1】:

最后只需要

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

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

【讨论】:

    【解决方案2】:

    尝试更改您的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;
                }
    
            }
    

    【讨论】:

      【解决方案3】:

      试试看

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

      【讨论】:

        【解决方案4】:

        尝试覆盖 AppendText 属性。

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

        【讨论】:

        • 嗨 Andrey,我遇到的问题不是处理非数字字符,而是事件调用 base.Text 而不是 override Text
        猜你喜欢
        • 2015-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多