Обнаружение нескольких событий Keyup/Keydown и остановки кода на каждом С#/VB.Net

58
5

У меня есть DataGridView на WinForms, где Column (0) показывает длинный список дат.

При нажатии стрелок вверх или вниз на клавиатуре пользователь меняет выбранную дату и запускает событие keyup/keydown. Это событие вызывает фрагмент кода, который является довольно требовательным.

Нет проблем с кодом активации keydown/keydown, который будет запущен, и последующим вызовом функции CreateLeagueTable,

Private Sub DGVresults_KeyUp(sender As Object, e As KeyEventArgs) Handles DGVresults.KeyUp

Dim col1 As Integer, row1 as integer
Dim NewDate As String

If e.KeyCode = Keys.Left OrElse e.KeyCode = Keys.Right Then
Exit Sub
End If

col1 = DGVresults.CurrentCell.ColumnIndex
row1 = DGVresults.CurrentCell.RowIndex

If Not (col1 <> 0) Then

NewDate = DGVresults.Rows(row1).Cells(0).Value

Call CreateLeagueTable(NewDate)

End If

End Sub

Однако, когда пользователь нажимает стрелку вверх/вниз "несколько раз в быстрой последовательности", событие keyup/keydown также запускается несколько раз, и я не хочу, чтобы это происходило.

Как я могу предотвратить многократное срабатывание события keyup/keydown и произойти только в последний день, когда пользователь приземлился?

Скажите, что пользователь нажимает стрелку вниз 10 раз быстро, чтобы перейти к нужной дате. Событие KeyUp также запускается 10 раз, и пользователь остается в ожидании, пока происходят эти 10 событий. Я хочу, чтобы дата последней ячейки была выбрана и уволена.

Можете ли вы переопределить подставку keyup/keydown с нажатой новой клавишей/клавишей?

Благодарю!

спросил(а) 2015-08-01T21:23:00+03:00 4 года, 5 месяцев назад
1
Решение
-4

Чтобы следующий код работал, вам нужен System.Windows.Forms.Timer называемый Timer1 (вы можете создать его, перетащив "Timer" в свою форму в Designer Designer.

Всякий раз, когда текущий выбор в DataGridView изменяется, таймер перезапускается с интервалом 2000 (2 секунды). Когда таймер гаснет, таймер останавливается и ваш код запускается.

Private Sub DGVresults_SelectionChanged(sender As Object, e As EventArgs) Handles DGVresults.SelectionChanged
Timer1.Interval = 2000
Timer1.Start()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
Timer1.Stop()
Dim col1 As Integer = DataGridView1.CurrentCell.ColumnIndex
Dim row1 As Integer = DataGridView1.CurrentCell.RowIndex

If col1 = 0 Then CreateLeagueTable(CStr(DataGridView1.Rows(row1).Cells(0).Value))
End Sub

Sub CreateLeagueTable(dt As String)
MessageBox.Show(dt) 'Your code replaces this
End Sub

ответил(а) 2015-08-01T22:45:00+03:00 4 года, 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема