2017-02-21 89 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);