0

3 つのラジオ ボタンがあります。変更イベントの背後にあるコードは次のとおりです。

    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;
        }
    }

ラジオ ボタンが 3 つしかない場合はこれで問題ありませんが、変更イベントの背後にそれぞれ 20 行のコードがある 7 つのラジオ ボタンがあるとしたら、大量の (不要な?) コードになります。上記を短縮しようとしましたが、最終的には次のようになりました。これは正しいです?

     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;
        }
    }
4

5 に答える 5

1

共通点を関数に抽出した 2 番目のコード サンプルは、私がこのリファクタリングを行った方法のように見えます。

名前を除いて、あなたが作ることができるのと同じくらい良いです(UpdateUserInfo少し良いかもしれません)。

于 2012-08-19T18:47:47.140 に答える
1

もっと良い方法があります。ラジオ ボタンの配列を宣言し、実行時に上記のイベントにバインドします。このバインド コードはデザイナー ページ内にはありません。これにより、単一のArrayRadio_checkedChangeイベントが発生します。このメソッドでは、sender プロパティを使用して、適切なラジオ ボタンのインデックスを把握し、それに応じてアクションを実行できます。

于 2012-08-19T18:51:10.943 に答える
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;
}
于 2012-08-19T18:58:35.073 に答える
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;
      }
}
于 2012-08-19T18:54:56.260 に答える
0

私が通常行うことは、タグ属性にインデックスを配置することです。このようにして、このイベントをすべての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;
    }
}
于 2012-08-19T18:55:48.503 に答える