0

我有一个枚举,其中包含 3 个复选框的 3 个值:

public enum Str
{
    Test = 1,
    Exam = 2,
    Mark = 4
}

想象一下这些是复选框。如果我选择其中任何一个都可以正常工作,但是当我选择多个复选框时,会添加枚举值。

当我检查测试和标记枚举值5时,当我选择测试和考试时,结果是3 我什至尝试了类型转换

 string sVal = "checkbox Value";
 bool ival = int.TryParse(sValue,out iVal);
 if(iVal)
 {
   int iValue = int.Parse(sValue)
    str s = (str)iValue;
 }

再次“s”返回附加值而不是枚举类型如何解决这个问题?

4

5 回答 5

1

我认为您正在寻找的是 Flags 属性:http: //msdn.microsoft.com/en-gb/library/system.flagsattribute.aspx

于 2013-01-11T12:58:53.583 回答
1

确实希望该值是 1 和 4 的加法。以下是测试值的方法:

public enum Str
{
    Test = 1,
    Exam = 2,
    Mark = 4
}

private static void Main()
{
    Str test = (Str)5;  // Same as  test = Str.Test | Str.Mark;

    if ((test & Str.Test) == Str.Test)
    {
        Console.WriteLine("Test");
    }

    if ((test & Str.Exam) == Str.Exam)
    {
        Console.WriteLine("Exam");
    }

    if ((test & Str.Mark) == Str.Mark)
    {
        Console.WriteLine("Mark");
    }

    Console.Read();
}

Flag应该使用该属性,以便其他人知道您的枚举应该与按位运算一起使用。但是这个属性本身什么都不做(可能会修改.ToString()结果)。

于 2013-01-11T13:03:11.543 回答
0

您需要做几件事才能为您工作。

  1. 在枚举上设置[Flags]属性。没有它它也能工作,但拥有它是一件好事,即使只是为了文档目的。

    [Flags]
    public enum Str
    {
      None = 0
      Test = 1,
      Exam = 2,
      Mark = 4
    }
    
  2. 要设置枚举,您需要循环选定的复选框并设置值,类似于:

    Str value = Str.None;
    if (chkTest.Checked)
       value = value | Str.Test;
    if (chkExam.Checked)
       value = value | Str.Exam;
    if (chkMark.Checked)
       value = value | Str.Mark;
    

    运行后,如果,假设,测试和考试被检查,值将是:

    (int) value       =>  3
    value.ToString()  => "Str.Test|Str.Exam".
    
  3. 要检查枚举值是否具有特定标志,您可以执行以下操作:

    Str value = ....
    if (value.HasFlag(Str.Test))
       // it has test selected 
    else
       // it does not have test selected
    

    或者你可以做

    Str value = ....
    if (value & Str.Test == Str.Test)
       // it has test selected 
    else
       // it does not have test selected
    
于 2013-01-11T13:09:02.060 回答
0
         if((EnumVal & Str.Exam) ==Str.Exam)|| EnumVal == Str.Exam) 

解决了.....

于 2013-01-11T13:16:05.157 回答
0

您不能使用 Flags 属性。但是你的枚举值应该是 2 的 pow。

枚举的 int 值:

var values = Enum.GetValues(typeof(Str)).Cast<int>().Where(x => (x & iVal) != 0).ToList()

然后:

values.Select(x => list[(int)Math.Log(x, 2)])

list是您的复选框列表,您可以对其进行迭代并设置为选中状态。

var list = new List<CheckBox>
           {
               firstCheckBox,
               secondCheckBox,
               thirdCheckBox,
           };
于 2013-01-11T13:16:08.443 回答