2013-09-24 71 views
0

這可能是一個微不足道的問題,但是,我還沒有找到答案。我試圖通過添加關鍵導航(箭頭鍵)的可能性來改進我的winforms應用程序。問題是我有許多按行和列排列的按鈕,並且已經證明導航很麻煩。向上/向右和向下/向左箭頭只增加和減少索引,而不是沿指定方向移動。到目前爲止,我唯一的想法是將按鈕索引映射到2d數組並將其用作參考按鈕,但是,我一直不成功。任何人有關於我如何實現這一點的一些想法或建議? 我使用C#在Visual Studio 2008和.NET3.5如何瀏覽按鈕的行/列

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(); 
     } 
} 

有了這個代碼,我不斷收到此錯誤數組 無效排名符中的每個元素:預期「」或‘]’

+0

描述事情是如何佈置的。直接在表單上?在諸如'TableLayoutPanel'的容器內部?導航......你的意思是在按下箭頭時將「改變焦點」改爲另一個按鈕?你有什麼嘗試...顯示一些代碼。 – DonBoitnott

+0

按鈕直接放在窗體上,以3x3格式排列。基本上我要求的是一種方法來改變焦點到箭頭鍵指向的按鈕,而不是索引中的下一個 –

回答

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鍵順序中的下一個。解決這個問題,你已經掌握了。對不起,但我沒時間去處理這個問題。

+0

真的很感謝答案。我還沒有設法讓它工作,但我確實有一些關於我個人理解的代碼的問題。爲什麼在填充字典時使用按鈕標籤?列表不會更好嗎?謝謝 –

+0

我假設你是指代碼中的一個列表。但是這對物理按鈕有什麼關係?使用按鈕上的「標籤」屬性爲您提供物理鏈接。在這個代碼示例中,它比實際更具前瞻性。假設在某個時候你需要按鈕來告訴你它是哪個號碼?使用'標籤',它可以。 – DonBoitnott