【问题标题】:Using enum to set visibility of elements?使用枚举设置元素的可见性?
【发布时间】:2013-06-23 14:32:43
【问题描述】:

我有 16 张桌子,属于 4 个不同的类别,比如苹果、橙子、草莓和樱桃。

我正在尝试添加一个带有单选按钮的过滤器,它将根据您选择过滤的水果设置可见性为真/假(默认情况下所有水果都是可见的)。

到目前为止我有;

我的枚举:

public enum FilterState
    {
        AllFruits,
        Apples,
        Oranges,
        Strawberries,
        Cherries
    }

我的财产

public FilterState FilterChoice
    {
        get { return (FilterState)(ViewState["filterChoice"] ?? FilterState.All); }
        set { ViewState["filterChoice"] = value; }
    }

桌子(除了水果不同,它们看起来一样):

 <table FilterState="Apples" runat="server" Visible="false">
      ...
 </table

我的事件处理程序的开始:

void filterPolicyBtn_Click(object sender, EventArgs e)
    {

        switch (FilterChoice)
        {
            case FilterState.AllFruits:

                //How can i set the states to visible?
                Visible = true;
                break;

            case FilterState.Apples:

                break;

            case FilterState.Oranges:

                break;

            case FilterState.Strawberries:

                break;

            case FilterState.Cherries:

                break;
        }

我知道我可以通过拥有 16 个不同的 ID 并手动将它们的可见性设置为单选按钮来解决这个问题。但这似乎是过度的工作。我也无法更改选项卡的顺序以使用某种包装器,因为它们需要按特定顺序排列..

我试图以正确的方式解决这个问题?如果是这样,我该如何完成这个:(感谢任何帮助!

【问题讨论】:

    标签: c# asp.net enums radio-button


    【解决方案1】:

    我猜 FilterChoice 是保存值的变量。

    // Replace apples with the appropriate enumeration
    Visible = FilterChoice == FilterState.AllFruits || 
              FilterChoice == FilterState.Apples; 
    

    【讨论】:

    • 半有效。毕竟,我在所有表中都添加了 ID,并且正在使用带有位字符的枚举标志
    【解决方案2】:

    我不确定我是否理解正确,但我认为......

    public enum FilterState
    {
        Apples = 1,
        Oranges,
        Strawberries,
        Cherries,
        Total
    }
    public void FilterChoice (int value)
    {
        int counter = 1;
        for (int i = 1; i < Total; i++)
            if (value & (counter << i))
                //actions to do if value is set
            else
                //actions if not set...
    }
    

    我认为您看起来像这样,希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      好的,所以我发现没有简单的方法可以做到这一点。最后,我必须为我的所有表设置 ID,然后我使用相同的枚举来设置 switch case 中的可见性。

      但是在进行到一半时,我遇到了带有位运算符的枚举标志,这让整个事情变得简单了很多。我会在这里为遇到相同问题的其他人提交我的代码:

      [Flags]
          public enum FilterState
          {
              Apples = 1,
              Oranges = 1 << 1,
              Strawberries = 1 << 2,
              Cherries = 1 << 3,
              AllFruits = (1 << 4) - 1
          }
      

      除此之外,我还创建了一个帮助类来缩短可见性的设置(不需要,但如上所述大大缩短了代码):

      public static class TestExtension
      {
          public static bool HasFlag(this FruitClass.FilterState e1, FruitClass.FilterState e2)
          {
              return ((e1 & e2) == e2);
          }
      }
      

      然后“所有”需要的是排序按钮和过滤功能的事件:

      private void Filter(FilterState filter)
          {
              ApplesA.Visible = ApplesB.Visible = ApplesC.Visible = filter.HasFlag(FilterState.Apples);
              OrangesA.Visible = OrangesB.Visible = OrangesC.Visible = OrangesD.Visible = filter.HasFlag(FilterState.Oranges);
              StrawberriesA.Visible = StrawberriesB.Visible = StrawberriesC.Visible = StrawberriesD.Visible = filter.HasFlag(FilterState.Automation);
              CherriesA.Visible = CherriesB.Visible = CherriesC.Visible = filter.HasFlag(FilterState.Cherries);
      
          }
      
          private void filterPolicyBtn_Click(object sender, EventArgs e)
          {
              var filter = FilterState.All;
      
              if (ApplesCheck.Checked) filter = FilterState.Apples;
              if (OrangesCheck.Checked) filter =  FilterState.Oranges;
              if (StrawberriesCheck.Checked) filter = FilterState.Automation;
              if (CherriesCheck.Checked) filter = FilterState.Cherries;
      
              Filter(filter);
      
          }
      
          private void ShowAll_Click(object sender, EventArgs e)
          {
              Filter(FilterState.All);
          }
      
      • Cammy 出局

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-22
        • 2011-07-27
        • 2013-07-22
        • 2013-05-22
        • 2011-06-29
        • 2020-01-21
        • 1970-01-01
        • 2018-12-28
        相关资源
        最近更新 更多