2017-07-19 77 views
0

我正在嘗試使用Windows應用程序進行掃雷遊戲。我想在方法中使用一個開關。c#如何參考當前按鈕

問題:

public void switcher() 
{ 
    switch (x) 
    { 
     case 0: 
      A1.BackgroundImage = Image.FromFile("empty.jpg"); // look at A1 
      break; 
     case 1: 
      A1.BackgroundImage = Image.FromFile("1.jpg"); 
      break; 
     case 2: 
      A1.BackgroundImage = Image.FromFile("2.jpg"); 
      break; 
     case 3: 
      A1.BackgroundImage = Image.FromFile("3.jpg"); 
      break; 
     case 4: 
      A1.BackgroundImage = Image.FromFile("4.jpg"); 
      break; 
     case 5: 
      A1.BackgroundImage = Image.FromFile("5.jpg"); 
      break; 
     case 6: 
      A1.BackgroundImage = Image.FromFile("6.jpg"); 
      break; 
     case 7: 
      A1.BackgroundImage = Image.FromFile("7.jpg"); 
      break; 
     case 8: 
      A1.BackgroundImage = Image.FromFile("8.jpg"); 
      break; 
    } 
} 

正如你可以看到,他們每個人說:「A1 .....」 A1是我的第一個按鈕的名稱,但也有很多其他的按鈕也是如此。有沒有一種方法可以引用按鈕的屬性,比如背景圖片,而不必使用它的名字?這會使編程變得更容易。

這裏的按鍵的簡化部分,如果它可以幫助:

private void A1_Click(object sender, EventArgs e) // < - I want to refer to this without using A1 name. 
{ 
    x = bombcount[0, 0]; 
    switcher();  
} 

編輯:答案之一工作。我對這些東西瞭解不多,但我會盡力多瞭解它們!謝謝!

+3

'切換器()'的類型應該是按鈕的參數。這樣你就可以使用你想要的任何按鈕的邏輯。只需根據需要傳入A1,B1,C1等。 'switcher(A1)' – Will

+2

它就在參數中 - 「sender」是引起事件處理程序被調用的實際控件。只需將它轉換爲'Button',將它傳遞給'switcher'即可完成(順便說一句,您也不需要開關)。 – Luaan

回答

1

獲取切換器的引用被單擊像這樣的按鈕:

 private void A1_Click(object sender, EventArgs e) 
    { 
      Button myB = (Button) sender; 
      x = bombcount[0,0]; 
      switcher(myB); 
    } 

    private void switcher(Button button) 
    { 
      switch (x) 
    { 
     case 0: 
      button.BackgroundImage = Image.FromFile("empty.jpg"); // look at A1 
      break; 
     case 1: 
      button.BackgroundImage = Image.FromFile("1.jpg"); 
      break; 
     case 2: 
      button.BackgroundImage = Image.FromFile("2.jpg"); 
      break; 
     case 3: 
      button.BackgroundImage = Image.FromFile("3.jpg"); 
      break; 
     case 4: 
      button.BackgroundImage = Image.FromFile("4.jpg"); 
      break; 
     case 5: 
      button.BackgroundImage = Image.FromFile("5.jpg"); 
      break; 
     case 6: 
      button.BackgroundImage = Image.FromFile("6.jpg"); 
      break; 
     case 7: 
      button.BackgroundImage = Image.FromFile("7.jpg"); 
      break; 
     case 8: 
      button.BackgroundImage = Image.FromFile("8.jpg"); 
      break; 
    } 
    } 
+0

「嘗試」不是答案。解釋你改變了什麼。 – CodeCaster

+0

對不起,沒有說明:在切換器方法中引入了對被點擊的按鈕的引用。 –

+0

您可以點擊[編輯]更新您的答案。 – CodeCaster

3

您需要完全重構此代碼。不要依賴於私有成員如x那樣,使用方法參數:

private void SetButtonImage(Button button, int number) 
{ 
    string imagePath; 

    if (number == 0) 
    { 
     imagePath = "empty.jpg"; 
    } 
    else 
    { 
     imagePath = number + ".jpg"; 
    } 

    button.BackgroundImage = Image.FromFile(imagePath); 
} 

然後調用它像這樣:

private void Button_Click(object sender, EventArgs e) 
{ 
    var button = sender as Button; 
    int number = bombcount[0, 0]; 

    SetButtonImage(button, number); 
} 

現在,您可以連接所有的按鈕點擊事件是單個事件處理程序,並且您可以刪除x成員,並且可以完全刪除該開關。