如何组合这三组代码

时间:2012-08-19 18:44:52

标签: c# winforms visual-studio-2010

我有三个单选按钮。他们的变更事件背后的代码如下:

    private void uxRajRadioButton_CheckedChanged(object sender, EventArgs e) 
    {
        if (uxRajRadioButton.Checked == true)
        {
            uxPersonBettingLabel.Text = "Raj";
            GuySelected = 0;
            uxBetNumericUpDown.Maximum =  Guys[GuySelected].Cash;
        }
    }
    private void uxPaulRadioButton_CheckedChanged(object sender, EventArgs e) 
    {
        if (uxPaulRadioButton.Checked == true) 
        {
            uxPersonBettingLabel.Text = "Paul";
            GuySelected = 1;
            uxBetNumericUpDown.Maximum = Guys[GuySelected].Cash;
        }
    }
    private void uxMikeRadioButton_CheckedChanged(object sender, EventArgs e) 
    {
        if (uxMikeRadioButton.Checked == true)
        {
            uxPersonBettingLabel.Text = "Mike";
            GuySelected = 2;
            uxBetNumericUpDown.Maximum = Guys[GuySelected].Cash;
        }
    }

只有三个单选按钮,这是可以接受的,但如果我说7个单选按钮,每个单独的代码后面有20行代码,那么它将是很多(不必要的?)代码。我试图缩短上述内容并最终得到以下内容。这是对的吗?

     private void uxRajRadioButton_CheckedChanged(object sender, EventArgs e) 
    { 
         radioButtonCode(this.uxRajRadioButton, 0);
     }
    private void uxPaulRadioButton_CheckedChanged(object sender, EventArgs e) 
    {
        radioButtonCode(this.uxPaulRadioButton,1);
    }
    private void uxMikeRadioButton_CheckedChanged(object sender, EventArgs e) 
    {
        radioButtonCode(this.uxMikeRadioButton, 2);
    }

    int GuySelected=0;
    public void radioButtonCode(RadioButton myRadio, int mybettorIndex)
    {
        if (myRadio.Checked == true)
        {
            GuySelected = mybettorIndex;
            uxPersonBettingLabel.Text = Guys[GuySelected].Name;
            uxBetNumericUpDown.Maximum = Guys[GuySelected].Cash;
        }
    }

5 个答案:

答案 0 :(得分:1)

你的第二个代码示例,你已经将函数的共性提取出来,就像我完成这个重构一样。

除了名字(UpdateUserInfo可能略好一些)之外,它可以做到最好。

答案 1 :(得分:1)

有一种更好的方法。声明一个单选按钮数组,并在运行时将它们绑定到上面的事件。此绑定代码不在设计器页面内。这将导致单个ArrayRadio_checkedChange事件。在此方法中,您可以使用sender属性来确定正确的单选按钮的索引并相应地执行操作。

答案 2 :(得分:1)

您是否可以为所有单选按钮使用相同的事件处理程序?像

这样的东西
private void uxRadioButton_CheckedChanged(object sender, EventArgs e) 
{ 
     radioButtonCode((RadioButton)sender);
}

public void radioButtonCode(RadioButton myRadio)
{
    if (myRadio.Checked == true)
    {
        int guySelected = getGuySelectedIndex(myRadio);
        uxPersonBettingLabel.Text = Guys[guySelected].Name;
        uxBetNumericUpDown.Maximum = Guys[guySelected].Cash;
    }
}

public int getGuySelectedIndex(RadioButton myRadio)
{
    int index = 0;
    if (myRadio == this.uxRajRadioButton) index = 0;
    else if (myRadio == this.uxPaulRadioButton) index = 1;
    else if (myRadio == this.uxMikeRadioButton) index = 2;
    return index;
}

答案 3 :(得分:0)

你可以使用

uxRajRadioButton.CheckedChanged += new EventHandler(rb_CheckedChanged);
uxPaulRadioButton.CheckedChanged += new EventHandler(rb_CheckedChanged);
...

uxRajRadioButton.Tag =new KeyValuePair<string,int>("Raj",0);
uxPaulRadioButton.Tag =new KeyValuePair<string,int>("Paul",1);
....

private void rb_CheckedChanged(object sender, EventArgs e) 
{
    if(!(sender is RadioButton))
         return;
       RadioButton myRadio= sender as RadioButton;
      if (myRadio.Checked == true)
      {
        myRadio.Text = (myRadio.Tag as KeyValuePair<string,int>).Key;
        GuySelected = (myRadio.Tag as KeyValuePair<string,int>).Value;
        uxBetNumericUpDown.Maximum =  Guys[GuySelected].Cash;
      }
}

答案 4 :(得分:0)

我通常做的是将索引放在tag属性中。这样您就可以将此事件绑定到每个RadioButton

public void uxRadioButton_CheckedChanged(object sender, EventArgs e)
{
    RadioButton myRadio = (RadioButton) sender;
    if (myRadio.Checked)
    {
        GuySelected = (int)myRadio.Tag;
        uxPersonBettingLabel.Text = Guys[GuySelected].Name;
        uxBetNumericUpDown.Maximum = Guys[GuySelected].Cash;
    }
}