2

有没有一种简单的方法可以像 Tab 键一样在表单上移动控件?这包括在 datagridview 等上移动单元格。

4

3 回答 3

2

使用 winforms 您应该将 Form KeyPreview 属性设置为 true

并在您应该拥有的表单的按键事件中

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == 13)
       GetNextControl(ActiveControl, true).Focus();
}
于 2008-12-08T01:52:32.100 回答
2

因为 datagridview 句柄是用于在单元格之间移动的自己的选项卡事件,所以您必须创建一个自定义 datagrid 控件并覆盖 onKeyUp 事件,如下所示:

Public Class MyCustomDataGrid
    Inherits DataGridView

    Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
        If e.KeyCode = Keys.Enter Then
            e.Handled = True
            Me.ProcessTabKey(Keys.Tab)
        Else
            MyBase.OnKeyUp(e)
        End If
    End Sub
End Class

这将在尝试通过数据网格单元格制表时将输入键作为制表键处理,如果您还需要在表单上处理制表符,则必须按照马里奥所说的做,但稍作改动。

Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
        If e.KeyCode = Keys.Enter AndAlso Not ActiveControl.GetType() Is GetType(Class1) Then
            e.Handled = True
            Me.ProcessTabKey(Not e.Shift)
        Else
            MyBase.OnKeyUp(e)
        End If
    End Sub

您只需添加对活动控件类型的检查,否则表单将阻止您的自定义数据网格选项卡代码工作。

于 2008-12-08T02:11:08.787 回答
0
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
Keys keyPressed = (Keys)msg.WParam.ToInt32();
switch (keyPressed)
{
    case Keys.Enter:
    case Keys.Tab:
        Control ctrl = this.GetNextControl(this.ActiveControl, true);
        while (ctrl is TextBox == false) 
        {
            ctrl = this.GetNextControl(ctrl, true);
        }
        ctrl.Focus();
        return true;
    default:
        return base.ProcessCmdKey(ref msg, keyData);
}
}
于 2017-08-16T02:33:31.960 回答