2009-11-09 112 views
0

我觉得这是一堆你明白我的意思。它的工作原理,但我觉得我在页面生命周期(加载和回发)方面超越了这一点,甚至在我的每个if语句中都有冗余。重写多个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; 
    } 
} 
+3

这个问题需要一个更具描述性的标题。 – ahsteele 2009-11-09 22:37:51

+0

更改标题,是否更好? – sharkin 2009-11-09 22:52:33

+0

我认为“重写多个if语句”可能是一个更具描述性的标题。 – 2009-11-09 22:55:11

回答

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

不,这将启用低点按钮。您需要在rhs表达式中使用该范围的两侧。 (rbn250Points.Enabled = totalPoints> = 250 && totalPoints <400;) – 2009-11-09 22:34:39

+0

雅各布,从代码,似乎是他在做... – 2009-11-09 22:37:20

+0

是的,这使得更多一点常识。好的,那么在计算新点之后如何清除按钮和回发呢?它正在检查页面加载和点击提交按钮后,因为我调用了这个方法两次(页面加载一次,如果他们没有提交buttong,并首次来到页面,如果他们提交另一个表格) – PositiveGuy 2009-11-09 22:38:02

1

那么,你可以用别的,如果不检查启动,并使用

if (totalpoints >= val) control.enable 

其中W生病让你少但却难免重复使

0

您可以在C#如下分配多个属性:

if (some condition) 
{ 
    rbnA.Enabled = rbnB.Enabled = rbnC.Enabled = rbnD.Enabled = true; 
} else { 
    rbnA.Enabled = rbnB.Enabled = rbnC.Enabled = rbnD.Enabled = false; 
} 
+2

是啊,我不喜欢这样的链接,很难阅读。 – PositiveGuy 2009-11-09 22:49:59

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

使用反射,你甚至可以自动填充字典。

+1

没有sh **这就是为什么我要求一些帮助 – PositiveGuy 2009-11-09 22:46:28

+0

一个问题,按钮没有你的想法的价值。值为0,1,2,3。此外,button.Checked = false由于某种原因 – PositiveGuy 2009-11-09 22:48:23

2

投入字典单选按钮和它们相关联的点值可以帮助:

// 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; 
} 
+0

我没有使用一个RadioButtonList,只是一群ASP.NET的单选按钮被一个Group属性绑定在一起,所以没有可以在单个RadioButton控件上使用的“value”属性 – PositiveGuy 2009-11-09 22:59:51

+0

否不,他不是试图在RadioButton上引用一个值,而是在他从字典中得到的键/值对对象上。我很久没有完成VB了,如果有一个Dictionary对象可用,那么我就没有不熟悉它,但重点是创建一个对象,将每个按钮与一个值配对,然后使用循环来遍历它们,而不是单独处理每个按钮。 – Jay 2009-11-09 23:14:27

+0

ah,yea,有道理,忘记了字典值。 – PositiveGuy 2009-11-09 23:16:53