2013-02-05 58 views
0

嗨,我有一個小的winforms程序,很快會發展到更多。該計劃有2個面板panel1panel2這些面板是動態填充一些表單控件。第一個面板用組合框填充,第二個用按鈕網格填充。我想要實現的是能夠禁用右鍵,具體取決於用戶從combobox中選擇的內容。網格的每一列表示一週中的某一天,如果您願意,則可以使用combobox從列表中選擇禁用所需日期。禁用動態按鈕

要做到這一點靜靜直截了當,但我的程序很快就會展開,因此它可以處理一個大型數據庫,這就是爲什麼我要動態地做到這一點。基本上這是我卡在那一刻,我想簡單地禁用正確的按鈕。

下面是我到目前爲止接口: enter image description here

這是我的代碼,如果任何幫助:

public Form1() 
     { 
      InitializeComponent(); 
     } 
     Button[] btn = new Button[2]; 
     ComboBox[] cmb = new ComboBox[1]; 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      placeRows(); 
     } 

     public void createColumns(int s) 
     { 
      for (int i = 0; i < btn.Length; ++i) 
      { 
       btn[i] = new Button(); 
       btn[i].SetBounds(40 * i, s, 35, 35); 
       btn[i].Text = Convert.ToString(i); 

       panel1.Controls.Add(btn[i]); 

      } 

      for (int i = 0; i < cmb.Length; ++i) 
      { 
       cmb[i] = new ComboBox(); 
       cmb[i].SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged); 
       cmb[i].Text = "Disable"; 
       cmb[i].Items.Add("Monday"); 
       cmb[i].Items.Add("Tuesday"); 
       cmb[i].SetBounds(40 * i, s, 70, 70); 
       panel2.Controls.Add(cmb[i]); 
      } 

     } 

     void cmb_SelectedIndexChanged(object sender, EventArgs e) 
     { 
      ComboBox senderCmb = (ComboBox)sender; 

      if (senderCmb.SelectedIndex == 1) 
      { 
       //MessageBox.Show("Tuesday"); 
       btn[1].Enabled = false; 
      } 
     } 

     public void placeRows() 
     { 
      for (int i = 0; i < 80; i = i + 40) 
      { 
       createColumns(i);    
      } 
     } 
    } 

回答

3

替代1

每個控件都有一個Tag屬性。

您可以設置按鈕的Tag屬性來表示他們是在列。

當選擇在組合框中進行,只需通過所有按鈕進行搜索,並啓用或禁用基於按鈕確定每個按鈕的Tag屬性是否與組合框中選定的文本匹配。

備選2

創建

Dictionary<string, List<Button>> buttonMap; 

其中鍵是表示列(「星期二」)的值並且該值是包含該標籤的按鈕的列表。最初創建按鈕時,也填充該字典。

如果使用備選方案2,則必須記住複選框的先前選定值,以便可以重新啓用不再禁用的按鈕。

如果您有很多按鈕,您可能會發現備選方案2明顯更快。

UPDATE

這裏的替代1.

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

    const int ROWS = 2; 
    const int COLS = 2; 

    Button[,] btn = new Button[ROWS,COLS]; 
    ComboBox[] cmb = new ComboBox[ROWS]; 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     placeRows(); 
    } 

    private readonly string[] cbTexts = new string[] { "Monday", "Tuesday" }; 

    public void createColumns(int rowIndex) 
    { 
     int s = rowIndex * 40; 

     // Your original code kept overwriting btn[i] for each column. You need a 2-D array 
     // indexed by the row and column 
     for (int colIndex = 0; colIndex < COLS; colIndex++) 
     { 
      btn[rowIndex, colIndex] = new Button(); 
      btn[rowIndex, colIndex].SetBounds(40 * colIndex, s, 35, 35); 
      btn[rowIndex, colIndex].Text = Convert.ToString(colIndex); 
      btn[rowIndex, colIndex].Tag = cbTexts[colIndex]; 

      panel1.Controls.Add(btn[rowIndex, colIndex]); 

     } 

     cmb[rowIndex] = new ComboBox(); 
     cmb[rowIndex].SelectedIndexChanged += new EventHandler(cmb_SelectedIndexChanged); 
     cmb[rowIndex].Text = "Disable"; 
     foreach (string cbText in cbTexts) 
     { 
      cmb[rowIndex].Items.Add(cbText); 
     } 
     cmb[rowIndex].SetBounds(40, s, 70, 70); 
     cmb[rowIndex].Tag = rowIndex; // Store the row index so we know which buttons to affect 
     panel2.Controls.Add(cmb[rowIndex]); 

    } 

    void cmb_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     ComboBox senderCmb = (ComboBox)sender; 

     int row = (int)senderCmb.Tag; 
     for (int col = 0; col < COLS; col++) 
     { 
      Button b = btn[row, col]; 
      // These three lines can be combined to one. I broke it out 
      // just to highlight what is happening. 
      string text = ((string)b.Tag); 
      bool match = text == senderCmb.SelectedItem.ToString(); 
      b.Enabled = match; 
     } 
    } 

    public void placeRows() 
    { 
     for (int rowIndex = 0; rowIndex < 2; rowIndex++) 
     { 
      createColumns(rowIndex); 
     } 
    } 
} 
+0

一個完整的工作示例中,我會嘗試這一點,但之前,我嘗試將我需要改變我創造我的按鈕的方式嗎? – Tacit

+0

@Tacit:不是。如果您使用方案1,只需添加'btn [i] .Tag =「星期一」(等等......您需要知道每個列在哪個列中)。首先選擇方案1。如果它太慢,請嘗試替代方案2. –

+0

好吧謝謝隊友我會給它以前希望我會成功 – Tacit