Переписать несколько операторов if - PullRequest
0 голосов
/ 10 ноября 2009

Я чувствую, что это куча из вас, знаете, что я имею в виду. Это работает, но я чувствую, что я переусердствовал с точки зрения жизненного цикла страницы (загрузка и обратная передача) и даже избыточности, которую я имею в каждом из операторов if здесь.

Что происходит, это:

  1. Этот метод вызывается очень загрузка страницы (неважно, обратная связь или безотносительно)
  2. Если пользователь отправляет из-за того, что он уменьшает их общее количество баллов (под этими радиокнопками есть кнопка, позволяющая им отправлять и запрашивать баллы).

Так что я называю этот метод также сразу после пользователь заявляет пункт (отправляет) который отбрасывает эти точки от их общего количества в следующий раз. Так на основе общего количества баллов в их учетная запись, мне нужно включить / отключить эти переключатели после обновления страницы после последней отправки

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

Ответы [ 6 ]

8 голосов
/ 10 ноября 2009

Учитывая, что я ничего не пропустил в вашем коде:

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;
}
2 голосов
/ 10 ноября 2009

Помещение переключателей и связанных с ними значений точек в словаре может помочь:

// 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;
}
2 голосов
/ 10 ноября 2009

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

Используя рефлексию, вы даже можете автоматизировать заполнение словаря.

2 голосов
/ 10 ноября 2009

Я не могу говорить о том, как / если / когда вы хотите начать все это, но есть определенное многословие, которое можно сократить. Например, последний бит, где вы включаете различные кнопки, может быть уменьшен до этого:

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;
}
1 голос
/ 10 ноября 2009

Ну, вы можете начать с проверки, если еще, и использовать

if (totalpoints >= val) control.enable

, что позволит вам менее повторяющееся включение

0 голосов
/ 10 ноября 2009

Вы можете назначить несколько свойств следующим образом в C #:

if ( some condition )
{
     rbnA.Enabled = rbnB.Enabled = rbnC.Enabled = rbnD.Enabled = true;
} else {
     rbnA.Enabled = rbnB.Enabled = rbnC.Enabled = rbnD.Enabled = false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...