2013-02-05 55 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