2

我有 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 并手动将它们的可见性设置为单选按钮来解决这个问题。但这似乎是过度的工作。我也无法更改选项卡的顺序以使用某种包装器,因为它们需要按特定顺序排列..

我试图以正确的方式解决这个问题?如果是这样,我怎么能完成这个:(任何帮助表示赞赏!

4

3 回答 3

0

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

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

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

于 2013-06-26T13:02:36.833 回答
0

我猜 FilterChoice 是保存该值的变量。

// Replace apples with the appropriate enumeration
Visible = FilterChoice == FilterState.AllFruits || 
          FilterChoice == FilterState.Apples; 
于 2013-06-26T12:45:14.933 回答
0

好吧,所以我发现没有简单的方法可以做到这一点。最后,我必须为我的所有表设置 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);
    }
  • 卡米出来
于 2013-06-27T15:00:58.667 回答