#vb.net #datagridview #cell-formatting
#vb.net #datagridview #форматирование ячейки
Вопрос:
У меня есть datagridview с 8 столбцами, и я хочу, чтобы индексы 5 и 6 принимали только числа, но, к сожалению, это также влияет на другие столбцы. что-то не так с этим кодом?
Private Sub GridJournal_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles GridJournal.EditingControlShowing
If GridJournal.CurrentCell.ColumnIndex = 5 Then
AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress
ElseIf GridJournal.CurrentCell.ColumnIndex = 6 Then
AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress
End If
End Sub
Private Sub TextBox_keyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
If Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = "." Or Asc(e.KeyChar) = 8) Then
e.Handled = True
End If
End Sub
Комментарии:
1. При создании элементов управления редактированием, если следующий необходимый (для следующей ячейки) имеет тот же тип, элемент управления редактированием используется повторно. Поскольку элемент управления используется повторно, к нему будет прикреплен тот же обработчик события нажатия клавиши.
2. В какой-то момент вы также поймете, что у вас есть множество обработчиков событий. Удалите старый добрый обработчик перед добавлением нового. Или используйте
e.Controls
ссылку для обработки элемента управления текстовым полем с помощью вашего собственного класса.
Ответ №1:
вам просто нужно условие else, чтобы удалить ваш обработчик.
If GridJournal.CurrentCell.ColumnIndex = 5 Or GridJournal.CurrentCell.ColumnIndex = 6 Then
RemoveHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress
AddHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress
Else
RemoveHandler CType(e.Control, TextBox).KeyPress, AddressOf TextBox_keyPress
End If