#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);
}
}