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

値を 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 に答える
1

あなたが探しているのは Flags 属性だと思います: http://msdn.microsoft.com/en-gb/library/system.flagsattribute.aspx

于 2013-01-11T12:58:53.583 に答える
0
         if((EnumVal & Str.Exam) ==Str.Exam)|| EnumVal == Str.Exam) 

解決済み.....

于 2013-01-11T13:16:05.157 に答える
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

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 に答える