2017-07-19 67 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成员,并且可以完全删除该开关。