C#: Выполнить действие исходя из отмеченных чекбоксов

243
16 сентября 2017, 22:11

Есть семь чекбоксов на форме, которые задают следующие параметры:

  1. Публиковать без текста
  2. Публиковать со своим текстом
  3. Публиковать с подписью
  4. Не копировать без фото
  5. Не копировать без аудио
  6. Не копировать без видео
  7. Не копировать без текста

Так же есть функция, для которой можно задать некоторые параметры публикации (но не все, для остальных есть другой код). Вот она:

patterns.vknet.Wall.Post(new WallPostParams
{
    OwnerId = -yourcom,
    Message = yorTextBox.Text,
    Attachments = SetAttachments(),
    FromGroup = true,
    PublishDate = DateForPost()
});

И получается так, что для того, чтобы публиковать пост с нужными параметрами, нужно создать кучу if-else конструкций и обработать таким образом все варианты. И сколько комбинаций нужно для этого? Это сотни строк повторяющегося кода. Других идей у меня нет, в голову ничего не приходит. Как это реализовать?

Answer 1

Не понял, как публиковать отличается от копировать, но эта штука явно раскладывается в последовательные if'ы, а не во вложенные:

if (chkПубликоватьБезТекста.Checked)
  текст = null;
else if (chkПубликоватьСоСвоимТекстом.Checked)
  текст = txtText.Text;
else
  текст = GenerateText();
подпись = chkПубликоватьСПодписью.Checked ? txtПодпись.Text : null;
if (chkНеКопироватьБезФото.Checked && !HasPhoto)
  return;
if (chkНеКопироватьБезАудио.Checked && !HasAudio)
  return;
if (chkНеКопироватьБезВидео.Checked && !HasVideo)
  return;
if (chkНеКопироватьБезТекста.Checked && string.IsNullOrEmpty(текст))
  return;
ВыполнитьДействие();
Answer 2

Можете воспользоваться флагами.

[Flags]
public enum PostState
{
    NoText = 1 << 0,
    WithYoursText = 1 << 1,
    WithSub = 1 << 2,
    WithoutImage = 1 << 3,
    WithoutAudio = 1 << 4,
    WithoutVideo = 1 << 5,
    WithoutText = 1 << 6
}

Общее состояние формы можно хранить в переменной, например так:

var state = (PostState)0;
if (noTextCheckBox.Checked)
{
    state |= PostState.NoText;
}
if (yourTextCheckBox.Checked)
{
    state |= PostState.WithYoursText;
}
...

Далее логическая задача - сопоставить состояние формы и поведение. Что поменяется в том или ином случае, как можно это обобщить? Флаги помогут по крайней мере абстрагироваться от checkBox-ов и обдумать логику.

READ ALSO
Асинхронный и синхронный методы

Асинхронный и синхронный методы

Имеется некий асинхронный метод:

193
Почему ошибка считаются: AddCapsInfo(); и Caps?

Почему ошибка считаются: AddCapsInfo(); и Caps?

Декларация функции - 7 параметров:

180
Выделить (X) закрыть на вкладке tabPage c#

Выделить (X) закрыть на вкладке tabPage c#

Здравствуйте, в самом конструкторе Visual Studio, в открытом окне когда наводишь курсор на вкладку (X) закрыть, данный крестик выделяется, крестик...

347