2017-02-21 97 views
0

我正在学习C#,并且我已经完成了使用Windows Forms创建计算器的练习。现在我只为数字和按钮添加了9个按钮(+, - ,*,/)和一个标签以数字形式写入字符串。目前我正在这样做:WinForms按钮阵列

private void button1_Click(object sender, EventArgs e) 
{ 
    WriteInLabel(1); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    WriteInLabel(2); 
} 
//etc. 

//function to write the Text in label1 
private void WriteInLabel(int i) 
{ 
    label1.Text += i.ToString(); 
} 

并记住DRY原则,这看起来像一种不好的书面代码给我。 有没有更好的写法?我想到了像按钮数组/列表。所以我可以做这样的事情:

for(int i = 0; i < btnArr.Length; i++) 
{ 
    //Is this the correct syntax for appending an eventListener? 
    btnArr[i]Click += (sender, args) => WriteInLabel(i);   
} 

现在的问题是,我想编辑Windows窗体设计器视图中的按钮属性。 我可以通过这样的自写代码获得按钮的设计视图吗?

Button btn1 = new Button(); 

或者是否有可能从Form1中自动创建按钮的数组? 我想这(没有工作):

List<Button> btnList = new List<Button>(); 
foreach(Button btn in Form1) 
{ 
    btnList.Add(btn); 
} 
+0

以什么方式没有工作?它将取决于一些按钮是如何制作的,如果他们被添加为儿童的形式等? – BugFinder

+0

嗯,我只是通过将一个Button-Form从工具箱拖到Form1来添加它们。我在我的最后一段代码片段中得到Form1下的红色波浪线,并说:Form1是一种类型,在当前上下文中无效。 –

回答

1

如果按钮名称遵循某种模式(如单词“按钮”加号),你可以使用一个循环的名字从Controls集合形式收集它们:

List<Button> btnList = 
    Enumerable.Range(1,9) 
    .Select(i => (Button)this.Controls["button"+i.ToString()]) 
    .ToList(); 

如果按键的数量很小,这也使得SENCE简单地列出所有在集合初始化:

var btnList = new List<Button> { button1, button2, button3, ... button9}; 
+0

它工作。非常感谢! –

0

不知道为什么你想通过程序生成按钮的数组:你不能让这些按钮的设计视图。

你可以在设计相同的事件处理程序分配给所有的按钮和事件处理程序做到这一点:

WriteInLabel((sender as Button).Text);