1

我在下拉列表中有很多 if-else 语句选择更改事件,用于根据当前下拉列表中的值选择填充另一个下拉列表。有没有通用的方法来减少任何参数类型的 if-else 语句。和这是我的下拉列表选择更改事件的代码

protected void ddlBr1Type_SelectedIndexChanged(object sender, EventArgs e)
{
      if (ddlBr1Type.SelectedValue.ToString() == ValidationFields.FO.ToString())
      {
           ddlBr2Type.DataSource = populateNearByDropdown(ValidationFields.FO.ToString());
           ddlBr2Type.DataBind();
      }
      else if (ddlBr1Type.SelectedValue.ToString() == ValidationFields.FW.ToString())
      {
          ddlBr2Type.DataSource = populateNearByDropdown(ValidationFields.FW.ToString());
            ddlBr2Type.DataBind();

     }
     else if (ddlBr1Type.SelectedValue.ToString() == ValidationFields.UF.ToString())
     {
          ddlBr2Type.DataSource = populateNearByDropdown(ValidationFields.UF.ToString());
            ddlBr2Type.DataBind();
     }
     else if (ddlBr1Type.SelectedValue.ToString() == ValidationTypes.O.ToString())
     {
         ddlBr2Type.DataSource = populateNearByDropdown(ValidationTypes.O.ToString());
            ddlBr2Type.DataBind();
     }
     else if (ddlBr1Type.SelectedValue.ToString() == ValidationTypes.W.ToString())
     {
          ddlBr2Type.DataSource = populateNearByDropdown(ValidationTypes.W.ToString());
            ddlBr2Type.DataBind();
     }
     else if (ddlBr1Type.SelectedValue.ToString() == ValidationTypes.P.ToString())
     {
          ddlBr2Type.DataSource = populateNearByDropdown(ValidationTypes.P.ToString());
            ddlBr2Type.DataBind();
     }
     else if (ddlBr1Type.SelectedValue.ToString() == ValidationTypes.C.ToString())
     {
            ddlBr2Type.DataSource = populateNearByDropdown(ValidationTypes.C.ToString());
            ddlBr2Type.DataBind();
      }

  }

这里 ValidationTypes 和 validationfields 是一个枚举列表,这是 PopulateNearbyDropdown 方法的代码

   private List<string> populateNearByDropdown(String Item1)
    {
        var MatchedItems =  new List<string>();
        var listofitems = new List<string> { "FO", "FW", "O", "W", "UF" };
        if (listofitems.Any(str => str.Contains(Item1)))
        {
            MatchedItems = new List<string> { Item1, ValidationTypes.P.ToString(), ValidationTypes.C.ToString() };
        }
        else if (Item1 == "P")
        {
            MatchedItems = new List<string> { Item1, ValidationTypes.C.ToString() };            
        }
        else if (Item1 == "C")
        {
            MatchedItems = new List<string> { Item1, ValidationTypes.U.ToString() };
        }
        else if (Item1 == "U"  || Item1 == "FC")
        {
            MatchedItems = new List<string> { Item1 };

        }
        return MatchedItems.ToList();
    }

有人可以帮忙吗.. 非常感谢提前...

4

7 回答 7

10

诶?

可以清楚地简化为

{
  ddlBr2Type.DataSource = populateNearByDropdown(ddlBr1Type.SelectedValue.ToString());
  ddlBr2Type.DataBind();
}

除非您想要进行一些检查(ddlBr1Type 是否有效)。

在这种情况下

{
    var valid = new HashSet<string>{ ValidationFields.FW.ToString(), ..... };
    if (valid.Contains(ddlBr1Type.SelectedValue))
    {
        ddlBr2Type.DataSource = populateNearByDropdown(ddlBr1Type.SelectedValue.ToString());
        ddlBr2Type.DataBind();
    }
}
于 2013-07-22T13:19:39.737 回答
2

由于您依赖字符串相等,我认为您根本不需要任何逻辑。这个 if 语句:

if (ddlBr1Type.SelectedValue.ToString() == ValidationFields.FO.ToString())
{
     ddlBr2Type.DataSource = populateNearByDropdown(ValidationFields.FO.ToString());
     ddlBr2Type.DataBind();
}

可以折叠为:

ddlBr2Type.DataSource = populateNearByDropdown(ddlBr1Type.SelectedValue.ToString());
ddlBr2Type.DataBind();

所有其他 if 语句都消失了。

于 2013-07-22T13:19:56.737 回答
2

你可以简单地这样做:

ddlBr2Type.DataSource = populateNearByDropdown(ddlBr1Type.SelectedValue.ToString());
ddlBr2Type.DataBind();

...

private List<string> populateNearByDropdown(String Item1)
{
    switch(Item1)
    {
        case "FO":
        case "FW":
        case "O":
        case "W":
        case "UF":
            return new List<string> { Item1, ValidationTypes.P.ToString(), ValidationTypes.C.ToString() };
        case "P":
            return new List<string> { Item1, ValidationTypes.C.ToString() };
        case "C":
            return new List<string> { Item1, ValidationTypes.U.ToString() };
        case "U":
        case "FC":
            return new List<string> { Item1 };
        default:
            return new List<string>();
    }
}
于 2013-07-22T13:20:33.890 回答
1

如果我没有误读您的代码,应该这样做:

protected void ddlBr1Type_SelectedIndexChanged(object sender, EventArgs e)
{
  ddlBr2Type.DataSource = populateNearByDropdown(ddlBr1Type.SelectedValue.ToString());
  ddlBr2Type.DataBind();
}
于 2013-07-22T13:19:46.213 回答
1
ddlBr2Type.DataSource = populateNearByDropdown(ddlBr1Type.SelectedValue.ToString());
ddlBr2Type.DataBind();
于 2013-07-22T13:20:15.240 回答
0

我认为代表检查一下

于 2013-07-22T13:31:55.397 回答
0

你可以用一个开关。但是因为每次你重复比较的正确部分,并假设它不会改变,我会简单地重写第一个方法,如下所示:

ddlBr2Type.DataSource = populateNearByDropdown(ddlBr1Type.SelectedValue.ToString());
ddlBr2Type.DataBind();

至于第二个,我会想到一个 swtich/case,或者可能是这种类型的值的一些反射(ValidationTypes.[letter].ToString(),但它不是很恒定,所以我不确定。

于 2013-07-22T13:26:27.703 回答