0

これは私の言いたいことを知っているあなたの山だと思います。それは機能しますが、ページのライフサイクル (ロードとポストバック) と、ここでの各 if ステートメントの冗長性についても、これをやり過ぎているように感じます。

何が起こるかは次のとおりです。

  1. このメソッドは、非常にページの読み込み時に呼び出されます (ポストバックなどに関係なく)
  2. ユーザーがフォームを送信すると、totalPoints が減ります (これらのラジオボタンの下に、送信してポイントを請求できるボタンがあります)。

そのため、ユーザーがポイントを要求 (送信) した直後にもこのメソッドを呼び出し、次回の合計ポイントからそれらのポイントを削除します。したがって、アカウントの合計ポイントに基づいて、最後の送信からページが更新された後、これらのラジオ ボタンを有効/無効にする必要があります。

private void SetPointsOptions()
{
    int totalPoints = customer.TotalPoints;

    rbn200Points.Text = "200 pts";
    rbn250Points.Text = "250 pts";
    rbn400Points.Text = "400 pts";
    rbn500Points.Text = "500 pts";
    rbn600Points.Text = "600 pts";

    // clear state of radio buttons & disable submit
    if (totalPoints < 200)
    {
        rbn200Points.Enabled = false;
        rbn250Points.Enabled = false;
        rbn400Points.Enabled = false;
        rbn500Points.Enabled = false;
        rbn600Points.Enabled = false;

        rbn200Points.Checked = false;
        rbn250Points.Checked = false;
        rbn400Points.Checked = false;
        rbn500Points.Checked = false;
        rbn600Points.Checked = false;

        btnClaimRewardPoints.Enabled = false;
        return;
    }

    if(totalPoints >= 200 && totalPoints < 250)
    {
        rbn200Points.Enabled = true;
    }
    else if(totalPoints >= 250 && totalPoints < 400)
    {
        rbn200Points.Enabled = true;
        rbn250Points.Enabled = true;
    }
    else if(totalPoints >= 400 && totalPoints < 500)
    {
        rbn200Points.Enabled = true;
        rbn250Points.Enabled = true;
        rbn400Points.Enabled = true;
    }
    else if(totalPoints >= 500 && totalPoints < 600)
    {
        rbn200Points.Enabled = true;
        rbn250Points.Enabled = true;
        rbn400Points.Enabled = true;
        rbn500Points.Enabled = true;
    }
    else if(totalPoints >= 600)
    {
        rbn200Points.Enabled = true;
        rbn250Points.Enabled = true;
        rbn400Points.Enabled = true;
        rbn500Points.Enabled = true;
        rbn600Points.Enabled = true;
    }
}
4

6 に答える 6

8

私があなたのコードで重要なものを見逃していなかったことを考えると:

private void SetPointsOptions()
{
    int totalPoints = customer.TotalPoints;
    rbn200Points.Enabled = totalPoints >= 200;
    rbn250Points.Enabled = totalPoints >= 250;
    rbn400Points.Enabled = totalPoints >= 400;
    rbn500Points.Enabled = totalPoints >= 500;
    rbn600Points.Enabled = totalPoints >= 600;
}
于 2009-11-09T22:31:19.597 に答える
2

どのように/もし/いつそれをすべて開始したいかについて話すことはできませんが、削減できる明確な冗長性があります。たとえば、さまざまなボタンを有効にする最後のビットは、次のように減らすことができます。

if(totalPoints > 200)
{
    rbn200Points.Enabled = true;
}
if(totalPoints > 250)
{
    rbn250Points.Enabled = true;
}
if(totalPoints > 400)
{
    rbn400Points.Enabled = true;
}
 if(totalPoints > 500)
{
    rbn500Points.Enabled = true;
}
if(totalPoints > 600)
{
    rbn600Points.Enabled = true;
}
于 2009-11-09T22:34:01.870 に答える
2

OMG、おい。これは途方もない量のコード重複です。

私はしばらく C# に触れておらず、VS も手元にありませんが、次のようになるはずです。

var points2buttons = new Dictionary<int, RadioButton>();
points2buttons[200] = rbn200Points;
points2buttons[250] = rbn250Points;
...
foreach (var pointsButton in points2buttons) {
    var button = pointsButton.Value;
    var pts = pointsButton.Key;
    button.Text = pts + " pts";
    button.Checked = totalPoints>pts;
}
...

リフレクションを使用すると、辞書への入力を自動化することもできます。

于 2009-11-09T22:41:39.107 に答える
2

ラジオ ボタンとそれに関連付けられたポイント値を Dictionary に配置すると、次のように役立つ場合があります。

// Untested.

int totalPoints = customer.TotalRewardPoints;

var radioButtons = new Dictionary<RadioButton, Int32>();
radioButtons.Add(rbn200Points, 200);
radioButtons.Add(rbn250Points, 250);
radioButtons.Add(rbn400Points, 400);
radioButtons.Add(rbn500Points, 500);
radioButtons.Add(rbn600Points, 600);

foreach (var keyValuePair in radioButtons)
{
  keyValuePair.Key.Text = String.Format("{0} pts", keyValuePair.Value);
  keyValuePair.Key.Enabled = (keyValuePair.Value < totalPoints);
  keyValuePair.Key.Checked = false;
}
于 2009-11-09T22:43:03.863 に答える
1

さて、あなたは他にチェックしないことから始めて、そして使うことができます

if (totalpoints >= val) control.enable

これにより、繰り返しの少ない有効化が可能になります

于 2009-11-09T22:32:52.077 に答える
0

C#では、次のように複数のプロパティを割り当てることができます。

if ( some condition )
{
     rbnA.Enabled = rbnB.Enabled = rbnC.Enabled = rbnD.Enabled = true;
} else {
     rbnA.Enabled = rbnB.Enabled = rbnC.Enabled = rbnD.Enabled = false;
}
于 2009-11-09T22:33:56.563 に答える