Обрабатывать событие KeyDown столбца ComboBox внутри C1FlexGrid

У меня есть ComboBox "Я назвал его Combo", который загружен внутри C1FlexGrid "Я назвал его fgMain" во втором столбце, и я хочу обработать клавиатуру, чтобы сделать нажатие клавиши Enter в этом комбинированном списке доступным для пользователей.

Я использую этот код, чтобы создать комбинированный список и заполнить его данными:

fgMain.Cols(2).Editor = Combo    
Combo.DrawMode = DrawMode.Normal    
Dim dap As New OleDbDataAdapter()    
        Dim dat As New DataTable()
        dap.SelectCommand = New OleDbCommand("SELECT EmpInfo.ManualId, EmpInfo.Name FROM EmpInfo;", conn)
        dap.Fill(dat)
        Combo.DataSource = dat
        Combo.DisplayMember = "Name"
        Combo.ValueMember = "ManualId"

Я использую этот код для обработки нажатия клавиши ввода в любой ячейке столбца 2 в c1flexgrid, он обрабатывает только 1-й ввод, нажатой в любой ячейке столбца 2, и заставляет выпадающий список выпадающего списка:

Private Sub fgMain_KeyDown(sender As Object, e As KeyEventArgs) Handles fgMain.KeyDown    
    Select Case e.KeyCode    
        Case Keys.Enter    
            Select Case fgMain.Selection.c1    
                Case 2    
                    fgMain.StartEditing(fgMain.Selection.BottomRow, 2)    
                    e.SuppressKeyPress = True    
                    e.Handled = True    
            End Select
     End Select    

Теперь мне нужно обработать, если пользователь выбрал свой желаемый элемент, тогда он нажмет клавишу ввода во второй раз... Моя проблема заключается в том, что когда я нажимаю второй ввод, чтобы выбрать выбор выбранного элемента, он появляется в " fgMain(e.row, 2) "менее чем на одну секунду, после чего весь ряд исчезает, а fgMain (e.row, 2) становится пустым

2 ответа

Похоже, что ваша проблема происходит, потому что вы используете событие KeyPress FlexGrid, в то время как вы хотите, чтобы ComboBox обрабатывал событие KeyPress. Вы можете использовать событие ComboBox или, если вам нужна некоторая ссылка на сетку, использовать событие KeyPressEdit. Событие KeyPressEdit соответствует событию System.Windows.Forms.Control.KeyPress, за исключением того, что оно запускается, когда сетка находится в режиме редактирования (в этом случае элементом управления, который получает ключ, является редактор, а не сама сетка).

Обратитесь к следующему фрагменту:

Private Sub fgM_KyDwnEdt(ByVal sender As Object, ByVal e As KeyEditEventArgs) Handles fgMain.KeyDownEdit
    Select Case e.KeyCode
        Case Keys.Enter
            Select Case fgMain.Selection.c1
                Case 2
                    fgMain.StartEditing(fgMain.Selection.BottomRow, 2)
                    e.Handled = True
            End Select
    End Select
End Sub

Мой руководитель команды сказал мне, что это не хороший способ, а комбинированный список в C1FlexGrid. ты можешь просто использовать этот способ

Dim tmpStyle As CellStyle
Dim MyCmd As New OleDbCommand
Dim DbReader As OleDbDataReader
MyCmd.Connection = conn
MyCmd.CommandText = "SELECT EmpInfo.ManualId, EmpInfo.Name FROM EmpInfo;"
DbReader = MyCmd.ExecuteReader
dtMap.Clear()
Do While DbReader.Read
    dtMap.Add(DbReader("ManualId"), DbReader("Name"))
Loop
tmpStyle = fgMain.Styles.Add("Name")
tmpStyle.DataType = GetType(Integer)
tmpStyle.DataMap = dtMap
fgMain.Cols(2).Style = tmpStyle
DbReader.Close()
MyCmd.Dispose()

Вы также не нуждаетесь в событии KeyPress или KeyPressEdit для обработки нажатия клавиш. вам просто нужно обработать событие AfterEdit, чтобы обработать то, что происходит после редактирования любой ячейки в столбце комбинированного списка. Надеюсь, этого было достаточно, чтобы помочь кому-либо когда-либо поместить комбо-бокс в C1FlexGrid.

Другие вопросы по тегам