0

这可能是一个微不足道的问题,但是,我还没有找到答案。我正在尝试通过添加键导航(箭头键)的可能性来改进我的 winforms 应用程序。问题是我有许多按行和列排列的按钮,而且导航起来很麻烦。UP/RIGHT 和 DOWN/LEFT 箭头只增加和减少索引,而不是在指定的方向移动。到目前为止,我唯一的想法是将按钮索引映射到二维数组并将其用作按钮的引用,但是,我没有成功。有人对我如何实现这一点有一些想法或建议吗?我在 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();
        }
}

使用此代码,我不断为数组的每个元素收到此错误 Invalid rank specifier: expected ',' or ']'

4

1 回答 1

0

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

表格本身:

在此处输入图像描述

这是该表单的代码:

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 Order 中的下一个。解决这个问题,你就明白了。抱歉,我没时间处理这个了。

于 2013-09-24T17:09:16.333 回答