2014-10-29 128 views
0

我是一個初學者,有一個任務,我必須編程NIM的遊戲。我從15個「代幣」開始,每次最多可以移除三個或「隱藏」。到目前爲止,我通過執行以下操作隱藏了這些令牌。有沒有更好的方法來關閉點擊按鈕?

private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Visible = false; 
} 
private void button2_Click(object sender, EventArgs e) 
{ 
    button2.Visible = false; 
} 

我只是複製和粘貼的是多次,並改變了按鈕號碼,這樣我的按鈕將關閉上點擊。這可能是顯而易見的,但有沒有更有效的方法來做到這一點,而不是有15個按鈕關閉方法?

+1

這個問題似乎是脫離主題,因爲它屬於http://codereview.stackexchange.com – Shiva 2014-10-29 20:20:13

+0

@JasonB你有沒有得到你的答案? – 2014-10-31 12:53:10

+0

@Riddle謝謝。 – 2014-11-04 05:32:28

回答

5

您可以使用相同的Click事件的每一個按鈕,並用發件人的對象,它鑄造Button

private void buttonsToClose_Click(object sender, EventArgs e) 
{ 
    ((Button)sender).Visible = false; 
} 

然後只是處理程序添加到您想要關閉自己的每一個按鈕點擊。

但是請注意,如果您或其他人在不是Button的對象上使用此處理程序,則會拋出InvalidCastException,所以如果您實際上要使用此代碼,則會添加某種有條件的檢查發件人的真實類型。

此外,您可以通過鑄造發件人Control代替,因爲從ControlButton繼承,並且所有Control對象具有Visible屬性重用此爲任何Control對象。下面是一個例子,有一個條件,以防止無效轉換:

private void controlToMakeInvisible_Click(object sender, EventArgs e) 
{ 
    if (sender.GetType() == typeof(Control)) 
    { 
     ((Control)sender).Visible = false; 
    } 
} 

最後要注意的 - 這似乎從你的文章一樣,你可能對事件的創建方法略有誤解和與Windows的對象連線中形式。如果你進入了設計,增加一個點擊事件,並看到彈出到你的表單代碼如下:

private void button1_Click(object sender, EventArgs e) 

這種方法的名字在它的功能沒有任何影響。 button1_Click的button1部分實際上與Buttonbutton1實際上沒有任何邏輯鏈接 - 它只是由Designer分配的默認名稱。將方法button1_ClickButton.Click事件的實際分配自動生成到您的Form的Designer.cs方法中。

這樣做的問題是,如果你複製並粘貼button1_Click和改變button1每發生率button2,就像這樣:

private void button2_Click(object sender, EventArgs e) 
{ 
    button2.Visible = false; 
} 

它不會當button2被點擊射擊。事實上,它永遠不會開火,因爲該方法實際上並未連接到任何控件/事件。

+0

如果你打算這樣做,可能會給它一個更具描述性的名字。 – clcto 2014-10-29 20:07:52

+0

我可能在這裏錯了,但我認爲你可以將'object'改爲'Button'並且仍然有效(不是以這種方式投射)。 – 2014-10-29 20:08:04

+0

你可以!另一種方法是將其轉換爲UIElement之類的東西,這可用於任何帶有可見性依賴項屬性的元素。我會更新帖子以反映這些想法。 – furkle 2014-10-29 20:08:49

-1

只需在foreach循環中調用您的事件。

private void Form1_Load(object sender, EventArgs e) 
{ 
    foreach (var button in Controls.OfType<Button>()) 
    { 
     button.Click += button_Click; 
    } 
} 

void button_Click(object sender, EventArgs e) 
{ 
    ((Control) sender).Visible = false; 
} 

如果你改變:

Controls.OfType<Button>() 

Controls.OfType<Control>() 

它將設置可見假的任何操作。所以你可以控制你想要事件提升的項目。

OfType摘要:根據指定的類型過濾IEnumerable的元素。

+0

這個特定實現的問題在於,它假設他希望在單擊它時關閉整個應用程序中的每個按鈕。 – furkle 2014-11-03 05:04:30

+0

@furkle我們可以簡單地通過foreach中的if語句來控制它,並且我們有多種條件選擇。 – 2014-11-03 07:17:50

相關問題