UserControl не вызывает событие нажатия клавиши при нажатии клавиши в C#

#c# #events #textbox #keypress

#c# #Мероприятия #текстовое поле #нажатие клавиши

Вопрос:

Я хотел бы создать текстовое поле, которое позволяет пользователю вводить только положительные двойные числа. Для этого я создал класс, который наследуется от System.Windows.Формы.Текстовое поле и добавлено событие нажатия клавиши следующим образом:

     public partial class PositiveDoubleOnlyTB : TextBox
    {
        private void InitializeComponent()
        {            
            this.SuspendLayout();
            // 
            // PositiveDoubleOnlyTB
            // 
            this.KeyPress  = new System.Windows.Forms.KeyPressEventHandler(this.PositiveDoubleOnlyTB_KeyPress);
            this.ResumeLayout(false);

        }

        private void PositiveDoubleOnlyTB_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!char.IsControl(e.KeyChar) amp;amp; !char.IsDigit(e.KeyChar) amp;amp;
                (e.KeyChar != '.'))
            {
                e.Handled = true;
                SystemSounds.Beep.Play();
            }

            // only allow one decimal point
            if ((e.KeyChar == '.') amp;amp; ((sender as TextBox).Text.IndexOf('.') > -1))
            {
                e.Handled = true;
                SystemSounds.Beep.Play();
            }

        }
    }
  

Проблема в том, что когда я ввожу данные в это пользовательское текстовое поле, событие нажатия клавиши не возникает. Может ли кто-нибудь помочь мне показать, что не так?

Комментарии:

1. если оно входит в PositiveDoubleOnlyTB_KeyPress?

2. 1) Добавьте отсутствующий конструктор по умолчанию. 2) Поскольку вы производны от элемента TextBox управления, вы должны переопределить OnKeyPress метод базового класса вместо подписки на KeyPress событие. Таким образом, вам не нужен InitializeComponent() метод (который никогда не вызывался для подключения KeyPress события Кстати.)

Ответ №1:

 public class PositiveDoubleOnlyTB : TextBox
{
    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (!(char.IsDigit(e.KeyChar) || e.KeyChar == '.' amp;amp; base.Text.IndexOf('.') == -1))
        {
            e.Handled = true;
        }

        base.OnKeyPress(e);
    }
}