C#.Select()不做这样的事情

时间:2015-02-04 19:21:42

标签: c#

我正在研究一个数独谜题,用于踢腿和咯咯笑。我在2d SudokuTextBox数组中设置网格(TextBox的扩展,用于设置我喜欢的方框)

然后使用文本框加载2D数组,并用x和y元素标记它们。

box.Tag = x.ToString() + y.ToString();

然后将其加载到数组中的该位置。

我将按键事件分配给导航框。

private void KeyNav(object sender, KeyEventArgs e)
{
    SudokuTextBox box = (SudokuTextBox)sender;
    string tag = box.Tag.ToString();
    int x = int.Parse(tag[0].ToString());
    int y = int.Parse(tag[1].ToString());

    if (e.KeyCode == Keys.Up)
        y--;
    else if (e.KeyCode == Keys.Down)
        y++;
    else if (e.KeyCode == Keys.Left)
        x--;
    else if (e.KeyCode == Keys.Right)
        x++;

    try { Grid[y, x].Select(); }
    catch {}
}

现在我检查了x和ys,目标元素/控制以及按键检测。一切都是正确的。

它只向左或向右移动,不向上或向下移动。如果我在左右键检查中将x--和x ++更改为y--和y ++,则它会上下移动。

检测到Keys.Up和Keys.Down,但.Select()不起作用!

有什么想法吗?

提前致谢!

编辑:

这是你想知道的网格创建。

        int locX = 5;
        int locY = 5;

        for (int y = 0; y < 9; y++)
        {
            locY += PointAdj(y);

            for (int x = 0; x < 9; x++)
            {
                locX += PointAdj(x);

                SudokuTextBox box = new SudokuTextBox();
                box.Location = new Point(locX, locY);
                box.Tag = x.ToString() + y.ToString();
                box.KeyDown += KeyNav;

                locX += box.square;

                Grid[y, x] = box;
                this.Controls.Add(Grid[y, x]);
            }
            locX = 5;
            locY += Grid[0, 0].square;
        }

    private int PointAdj(int point)
    {
        if (point % 3 != 0 || point == 0)
            return 0;
        else
            return 5;
    }

2 个答案:

答案 0 :(得分:0)

我的好友在MSDN上发现了这个

“要仅在表单级别处理键盘事件而不启用其他控件来接收键盘事件,请将表单的KeyPress事件处理方法中的KeyPressEventArgs.Handled属性设置为true。某些键,例如TAB,RETURN, ESC和箭头键由控件自动处理。要使这些键引发KeyDown事件,必须覆盖表单上每个控件中的IsInputKey方法。重写IsInputKey的代码需要确定是否有一个特殊的按下键并返回值true。您可以处理PreviewKeyDown事件并将IsInputKey属性设置为true,而不是覆盖IsInputKey方法。有关代码示例,请参阅PreviewKeyDown事件。“

https://msdn.microsoft.com/en-us/library/system.windows.forms.control.keydown%28v=vs.110%29.aspx

如果其他人有此问题!

答案 1 :(得分:0)

好的,这就是问题所在。 Multiline = true;这覆盖了上下键事件。将其设置为false将消除该事件,并允许您在向上和向下箭头时按下自己的按键。