使用类似于Excel单元格的箭头键通过TextBoxes进行聚焦

时间:2015-09-07 13:21:45

标签: c# winforms

基本上我有TextBoxes的列表,我添加了我想要关注的所有TextBoxes。 在Form1_Load我正在使用Arrows列出TextBoxes列表,其中包含其他列表EURTextBoxEurChange等等...

所以我试图关注这些TextBoxes,就像它们在类似于excel的2x6矩阵中一样。你能建议我的功能或有用的链接

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    List<TextBox> Arrows = new List<TextBox>();
}



private void Form1_Load(object sender, EventArgs e)
{
     for (int i = 0; i < 2; i++)
     {
           Arrows.Add(EURTextBox[i]);
           Arrows.Add(EURchange[i]);
           Arrows.Add(Cvetno1TextBox[i]);
           Arrows.Add(Cvetno1change[i]);
           Arrows.Add(Cvetno2TextBox[i]);
           Arrows.Add(Cvetno2change[i]);        
     }
}

2 个答案:

答案 0 :(得分:1)

这种功能的唯一问题,如何区分&#34;用户需要在单元格(文本框)之间导航&#34;或者&#34;用户想要导航到文本中进行编辑&#34;。

您可以使用文本框列表来解决它

foreach (var textBox in Arrows)
        {
            textBox.PreviewKeyDown += new PreviewKeyDownEventHandler(textBox_PreviewKeyDown);
        }

事件实施

void textBox_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        int i = _arrows.IndexOf(sender as TextBox);
        if (i <= -1) return;
        switch (e.KeyCode)
        {
            case Keys.Left:
                break;
            case Keys.Right:
                break;
            case Keys.Up:
                break;
            case Keys.Down:
                break;
        }
    }

根据列表和箭头键中项目的索引,您可以找到要移动到的文本框。

如果列表中的文本框索引类似于此enter image description here

规则示例:

  • index&lt; 11和Keys.Down Arrows [index + 1] .Focus()
  • index&gt; 0和Keys.Up Arrows [index-1] .Focus()
  • index&lt; 6和Keys.Right Arrows [index + 6] .Focus()
  • index&gt; 5和Keys.Left Arrows [index-6] .Focus()

如果您不想使用向下键从5传递到6,则将条件更改为索引&lt; 11到(索引&lt; 11和索引!= 5)等

答案 1 :(得分:0)

首先,阅读这个问题的答案: Up, Down, Left and Right arrow keys do not trigger KeyDown event

他们会给你一个关于如何捕捉箭头按键的非常好的想法。

为了移动你需要知道当前关注哪个文本框(活动),为此你可能需要转向类似switch语句来查找ActiveControl的正确名称。像这样:

switch(this.ActiveControl.Name.ToString())
{
    case "txtBox1":
       // Do something fancy with this and the captured Arrow key 
       // and set focus to the correct text box.
       break;
    case "txtBox2":
       // Do something fancy with this and the captured Arrow key 
       // and set focus to the correct text box.
       break;
}

理论上应该这样做。 :)