Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何相对于所选按钮更改上、下、左、右按钮的焦点?_C#_Winforms - Fatal编程技术网

C# 如何相对于所选按钮更改上、下、左、右按钮的焦点?

C# 如何相对于所选按钮更改上、下、左、右按钮的焦点?,c#,winforms,C#,Winforms,我是编程新手 我不知道怎么解释好 如何使我的WinForms应用程序理解按钮位置, 例如,假设放置了许多按钮,其中一个是select 按钮1-按钮2-按钮3 按钮4-(按钮5)-按钮6 按钮7-按钮8-按钮9 如何按下键盘并跳转到(按钮8)和不跳转到(按钮6),或按向上键并从(按钮2)跳转。 如何让visual studio了解哪个按钮相对于所选按钮是向上还是向下或向左和向右的?我假设您所说的是表单中的按钮 把它们放在这样的列表中 List<Button> buttons = new

我是编程新手

我不知道怎么解释好

如何使我的WinForms应用程序理解按钮位置, 例如,假设放置了许多按钮,其中一个是select

按钮1-按钮2-按钮3

按钮4-(按钮5)-按钮6

按钮7-按钮8-按钮9

如何按下键盘并跳转到(按钮8)和不跳转到(按钮6),或按向上键并从(按钮2)跳转。
如何让visual studio了解哪个按钮相对于所选按钮是向上还是向下或向左和向右的?

我假设您所说的是表单中的按钮

把它们放在这样的列表中

List<Button> buttons = new List<Button>() {Button1, Button2...}
List buttons=new List(){Button1,Button2…}
现在你知道了你正在使用的按钮,上升意味着你需要获取当前索引并从中减去3*(Button6->Button3),然后将其用作列表的新索引。 对于down,您添加3*,左/右为负/正1

现在,您只需定义边缘情况: 当你按下按钮9时,如果按下向下或向右怎么办

*此值根据列的数量而更改。3列=>+/-3;4列=>+/-4


您可以将按钮添加到,因此每个按钮的位置由TableLayoutPanel的(
列:行
)坐标确定

  • 创建一个TableLayoutPanel(在下面,名为
    tlpButtons
    ),其中有足够的行和列来容纳按钮。如果需要,可以在运行时添加/删除行和列
  • 选择所有按钮并使用表单设计器中的PropertyGrid订阅,以便所有按钮都只有一个事件处理程序(在此代码中,事件处理程序名为
    按钮\u PreviewKeyDown
  • 当按下
    键.Up
    键.Down
    时,将调用按钮的
    PreviewKeyDown
    处理程序。sender参数引用触发事件的控件,因此我们将
    sender
    强制转换为
    控件
    (因为只需要控件类型引用,所以我们不使用特定于派生类型的任何属性,如
    按钮
  • 如果我们处理按下的键,我们必须设置,否则事件将传递给控件并进行处理(导致触发正常选择)
  • TableLayoutPanel返回此控件的行/列位置
  • 我们只需设置行值
    ±1
    ,具体取决于按下的光标键(同时检查新值是否在
    [0:rowscont]
    范围内)。
    该方法返回控件在新位置的引用:我们使用该引用设置当前位置
结果是:


注:
按钮\u PreviewKeyDown
事件处理程序对于所有按钮/控件都是相同的。
tlpButtons
是用作按钮/控件容器的TableLayoutControl的名称

更新为在激活或不激活时也使用数字键盘

private void按钮\u PreviewKeyDown(对象发送方,PreviewKeyDown事件参数e)
{
var btn=发送方作为控制;
var pos=tlpButtons.GetPositionFromControl(btn);
bool-moveFocus=false;
开关(如钥匙代码){
case key.NumPad8:
案例密钥。向上:
位置行=(位置行>0)?位置行-1:tlpButtons.RowCount-1;
moveFocus=true;
打破
case Keys.NumPad2:
案例键。向下:
位置行=(位置行<(tlpButtons.RowCount-1))?位置行+1:0;
moveFocus=true;
打破
case Keys.numpa4:
如果(位置列>0){
位置列-=1;
}
否则{
pos.Column=tlpButtons.ColumnCount-1;
位置行=位置行>0?位置行-1:tlpButtons.RowCount-1;
}
moveFocus=true;
打破
case Keys.NumPad6:
如果(位置列<(tlpButtons.ColumnCount-1)){
位置列+=1;
}
否则{
位置列=0;
位置行=(位置行
我不明白。这与Visual Studio有什么关系?你在说什么按钮?在VisualStudio中?在窗体设计器中?在WPF中?WebForms?它是windows窗体,我正在尝试用visual studio制作GUI,好吧,你不想visual studio“理解它”,你想让你的应用程序做点什么。覆盖表单的“OnKeyDown”,处理Keys.Down键,然后您可以实现一些逻辑“如果当前按钮=5且Key=Down,则选择8”。当然,后者需要一些系统性,但首先要做的是事件处理。你可能可以修改这个问题的答案,让它使用按钮而不是文本框。我认为这个概念是一样的。应该注意的是,这只适用于OP指定的列的精确配置。如果他们添加了一个新的列,那么数学将需要修改。这是正确的,我添加了一个注释来反映这个问题PO-new List(新列表
private void buttons_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
{
    var btn = sender as Control;
    var pos = tlpButtons.GetPositionFromControl(btn);
    bool moveFocus = false;

    switch (e.KeyCode) {
        case Keys.NumPad8:
        case Keys.Up:
            pos.Row = (pos.Row > 0) ? pos.Row - 1 : tlpButtons.RowCount - 1;
            moveFocus = true;
            break;
        case Keys.NumPad2:
        case Keys.Down:
            pos.Row = (pos.Row < (tlpButtons.RowCount - 1)) ? pos.Row + 1 : 0;
            moveFocus = true;
            break;
        case Keys.NumPad4:
            if (pos.Column > 0) {
                pos.Column -= 1;
            }
            else {
                pos.Column = tlpButtons.ColumnCount - 1;
                pos.Row = pos.Row > 0 ? pos.Row - 1 : tlpButtons.RowCount - 1;
            }
            moveFocus = true;
            break;
        case Keys.NumPad6:
            if (pos.Column < (tlpButtons.ColumnCount - 1)) {
                pos.Column += 1;
            }
            else {
                pos.Column = 0;
                pos.Row = (pos.Row < tlpButtons.RowCount - 1) ? pos.Row + 1 : 0;
            }
            moveFocus = true;
            break;
    }
    if (moveFocus) {
        e.IsInputKey = true;
        var ctrl = tlpButtons.GetControlFromPosition(pos.Column, pos.Row);
        if (ctrl != null) this.ActiveControl = ctrl;
    }
}