1

我有一个 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"

我使用此代码来处理在 c1flexgrid 的第 2 列中的任何单元格上按 enter 它只处理在第 2 列中的任何单元格上按的第一个 enter 并使组合框的下拉列表出现:

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) 变为空

4

2 回答 2

1

看起来您的问题正在发生,因为您正在使用FlexGrid 的KeyPress事件,而您希望 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
于 2014-11-07T10:50:01.297 回答
0

我的团队负责人告诉我,这不是将组合框放入 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 的人

于 2014-12-10T08:31:25.843 回答