我正在研究一个数独谜题,用于踢腿和咯咯笑。我在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;
}
答案 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将消除该事件,并允许您在向上和向下箭头时按下自己的按键。