Изначально у меня был следующий:Другого метода перебора перечисления
[Flags]
public enum QueryFlag
{
None = 0x00,
CustomerID = 0x01,
SalesPerson = 0x02,
OrderDate = 0x04
}
Как флажки проверяется/снят, я хотел бы добавить/удалить флаги:
QueryFlag qflag;
Моей идеи - когда пользователь нажимает кнопку «Поиск», я бы перебирал фактические флаги, установленные в qflag
, чтобы изменить предложение .Where
в моей LINQ to Sql. Однако Enum.GetValues(qflag.GetType())
возвращает все значения самого QueryFlag. Не полезно.
Мое решение:
class myForm : Form
{
List<QueryFlag> qflag = new List<QueryFlag>();
private void chkOrderDate_CheckedChanged(object sender, EventArgs e)
{
if (chkOrderDate.Checked && !qflags.Contains(QueryFlag.OrderDate))
qflags.Add(QueryFlag.OrderDate);
else
qflags.Remove(QueryFlag.OrderDate);
}
private void cmdSearch_Click(object sender, EventArgs e)
{
if (qflags.Count == 0)
{
rtfLog.AppendText("\nNo search criteria selected.");
return;
}
foreach (QueryFlag flag in qflag)
{
rtfLog.AppendText(string.Format("\nSearching {0}", flag.ToString()));
// add switch for flag value
}
}
}
public enum QueryFlag
{
CustomerID,
SalesPerson,
OrderDate
}
У меня есть 3 флажков и это работает без каких-либо проблем в этой точке. Но мне интересно, есть ли лучший способ выполнить эту итерацию.
Это не позволит вам сбросить бит. Оригинал правильно протестировал свойство «Проверено». –
@Ben: Хорошая добыча; это было просто глупое наблюдение с моей стороны. Я обновлю ответ. –
@ Dan: спасибо ... не знаю, почему я не думал о сравнении флагов, установленных в 'qflag', с значениями перечисления. Имеет смысл. Я не думаю, что хочу идти по маршруту расширения - бокс/распаковка крайне непривлекателен для этого проекта; однако я буду помнить об этом, если возникнет такая необходимость. – IAbstract