То, как вы это делали изначально, было правильным;ты только что испортил метод Enum.GetValues
.Этот метод возвращает каждое определенное значение для определенного типа enum
, да.Итак, что вы делаете с этим, проверяете каждое определенное значение против вашего определенного enum
значения, чтобы увидеть, установлено ли определенное значение в вашем значении.
То есть, вы должны сделать следующее:
private void chkOrderDate_CheckedChanged(object sender, EventArgs e)
{
if (chkOrderDate.Checked)
{
qFlag |= QueryFlag.OrderDate;
}
else
{
qFlag &= (~QueryFlag.OrderDate);
}
}
... и аналогично для других ваших флажков.Затем, когда вы захотите перечислить, какие флаги вы установили:
static IEnumerable<QueryFlag> GetFlags(QueryFlag flags)
{
foreach (QueryFlag flag in Enum.GetValues(typeof(QueryFlag)))
{
// Presumably you don't want to include None.
if (flag == QueryFlag.None)
{
continue;
}
if ((flags & flag) == flag)
{
yield return flag;
}
}
}
Фактически, вы можете даже абстрагировать вышеприведенное в удобный метод расширения для всех enum
типов:
public static class FlagsHelper
{
// This is not exactly perfect, as it allows you to call GetFlags on any
// struct type, which will throw an exception at runtime if the type isn't
// an enum.
public static IEnumerable<TEnum> GetFlags<TEnum>(this TEnum flags)
where TEnum : struct
{
// Unfortunately this boxing/unboxing is the easiest way
// to do this due to C#'s lack of a where T : enum constraint
// (there are ways around this, but they involve some
// frustrating code).
int flagsValue = (int)(object)flags;
foreach (int flag in Enum.GetValues(typeof(TEnum)))
{
if ((flagsValue & flag) == flag)
{
// Once again: an unfortunate boxing/unboxing
// due to the lack of a where T : enum constraint.
yield return (TEnum)(object)flag;
}
}
}
}
Ваш обработчик cmdSearch_Click
может выглядеть так:
private void cmdSearch_Click(object sender, EventArgs e)
{
if (qFlag == QueryFlags.None)
{
rtfLog.AppendText("\nNo search criteria selected.");
return;
}
foreach (QueryFlag flag in qFlag.GetFlags())
{
rtfLog.AppendText(string.Format("\nSearching {0}", flag.ToString()));
// add switch for flag value
}
}