如何浏览按钮的行/列

时间:2013-09-24 10:42:02

标签: c# visual-studio-2008 .net-3.5

这可能是一个微不足道的问题,但是,我还没有找到答案。我正在尝试通过添加键导航(箭头键)的可能性来改进我的winforms应用程序。问题是我有许多按行和列排列的按钮,它已被证明很难导航。 UP / RIGHT和DOWN / LEFT箭头仅增加和减少索引,而不是沿指定方向移动。到目前为止,我唯一的想法是将按钮索引映射到2d数组并使用它作为按钮的引用,但是,我没有成功。任何人对如何实现这一点有一些想法或建议? 我在Visual Studio 2008和.NET3.5上使用C#

Control[,] MyButtons = new Control[4,3] { {b1,b2,b3},{b4,b5,b6},{b7,b8,b9},{btn_Clear,b0,btn_Cancel}};
   for(int i=0;i<4;i++)
      for (int j = 0; j < 3; j++)
      {
        switch (e.KeyValue)
        {
          case 13: //return
            { e.Handled = false; break; }

          case 39:  //Right
            {
               j++;
               break;
            }
          case 38:  //Up
            {
               i++;
               break;
            }
          case 37: //Left
            {
               j--;
               break;
            }

          case 40: //Down
            {
               i--;
               break;
            }
        }
        if (e.KeyValue != 13)
        {
           e.Handled = true;                         //Don't pass on the keystroke
           MyButtons[i,j].Focus(); // Set the focus to the selected control
          Application.DoEvents();
        }
}

使用此代码,我不断为数组的每个元素获取此错误      无效的排名说明符:预期','或']'

1 个答案:

答案 0 :(得分:0)

我会给你一个完整的例子,你可以推断你的项目/代码。

表单本身:

enter image description here

以下是该表单的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class frmButtons : Form
    {
        private Int32 _selectedButton = 1;
        private Dictionary<Int32, Button> _buttonDict = new Dictionary<Int32, Button>();

        public frmButtons()
        {
            InitializeComponent();

            foreach (Button b in this.Controls.OfType<Button>().Where(x => x.Tag != null))
            {
                Int32 i;
                if (Int32.TryParse(b.Tag.ToString(), out i))
                    _buttonDict.Add(i, b);
            }
            if (_buttonDict.Count > 0)
                _buttonDict[_selectedButton].Focus();
        }

        private void frmButtons_KeyUp(Object sender, KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case Keys.Up:
                    _selectedButton -= 3;
                    e.Handled = true;
                    break;
                case Keys.Down:
                    _selectedButton += 3;
                    e.Handled = true;
                    break;
                case Keys.Left:
                    _selectedButton -= 1;
                    e.Handled = true;
                    break;
                case Keys.Right:
                    _selectedButton += 1;
                    e.Handled = true;
                    break;
                case Keys.Enter:
                    break;
            }

            if (_selectedButton < 1)
                _selectedButton += 12;
            else if (_selectedButton > 12)
                _selectedButton -= 12;
            _buttonDict[_selectedButton].Focus();
        }
    }
}

当你点击某个键时我注意到了一个问题...在表单中有一个默认行为,它尝试处理箭头键以移动到Tab顺序中的下一个。解决这个问题,你就明白了。对不起,但我没时间研究这个。