Функция или цикл для флажков - PullRequest
0 голосов
/ 07 февраля 2019

Так, например, у меня есть 5 флажков с именами checkbox1, checkbox2 и т. Д.

Все они имеют назначенный параметр в другой функции (checkbox1 имеет строку text1 = "t1", checkbox2 string text2 = "t2" и т. Д.),Эти строки могут быть случайными, но выдают значение true только тогда, когда они указаны выше.

Позволяет пользователю выбрать 3 флажка, нажать некоторую кнопку и ....

Как создать функцию / циклкоторые проверяют только те выбранные флажки и видят, имеет ли флажок1 текст1 = t1 и т. д.?Примерно так:

string text1, text2, text3, text4, text5 = null;
int a = 0;

while (a != 347)
{
    text1 = SomeOperation1();
    text2 = SomeOperation2();
    text3 = SomeOperation3();
    text4 = SomeOperation4();
    text5 = SomeOperation5();

    if ((checkbox1.Checked && text1 == "t1") && 
        (checkbox3.Checked && text3 == "t3") && 
        (checkbox5.Checked && text5 == "t5"))
    {
        SomeOperation6();
        a = 347;
    }
}

Это if неверно, потому что он должен установить флажки (пользователь может выбрать больше или меньше 3), но теперь, может быть, вы понимаете, что я хочу:)

1 Ответ

0 голосов
/ 07 февраля 2019

Все элементы управления в форме можно найти в коллекции Controls формы (обратите внимание, что элементы управления, являющиеся частью элемента управления контейнера, будут найдены в коллекции Controls этого элемента управления контейнера).

Youможно использовать метод расширения System.Linq OfType, чтобы получить только элементы управления определенного типа, выполнив что-то вроде этого:

var allCheckboxControls = Controls.OfType<CheckBox>();

Если вы хотите получить только проверенные элементы управления,затем к этому можно добавить предложение Where:

var allCheckedCheckBoxes = Controls.OfType<CheckBox>().Where(c => c.Checked);

И, наконец, если вы хотите сравнить свойство Name со свойством Text (в этой части я не уверен -ваш вопрос был немного неясен), тогда вы можете сделать что-то вроде этого:

private void button1_Click(object sender, EventArgs e)
{
    // Display a message box showing the Name and Text for each Checked CheckBox
    foreach (var checkbox in Controls.OfType<CheckBox>().Where(c => c.Checked))
    {
        MessageBox.Show($"Checkbox named {checkbox.Name}, " + 
            $"with Text {checkbox.Text}, is checked");
    }
}

Я обновил ваш пример кода, чтобы он компилировался, и чтобы он лучше выражал то, что я думаю Ваше намерение основано на ваших комментариях.Пожалуйста, исправьте это, если я ошибся.

Похоже, у вас есть соответствие между тремя вещами - Checkbox, string результатом вызова метода и string для сравнения предыдущей строкис. И кажется, что вы хотите оценить сравнение строк только для отмеченных флажков .

Если это так, то, вероятно, самое простое, что можно сделать, учитывая существующий код, - простодобавьте еще одно условие к каждому существующему условию, чтобы оно возвращало значение true, если: (флажок не установлен) ИЛИ (условия выполнены).Обратите внимание, что условия не оцениваются, если соответствующий флажок не установлен , что неявно делает ваш текущий код.

Например:

while (a != 347)
{
    text1 = SomeOperation1();
    text2 = SomeOperation2();
    text3 = SomeOperation3();
    text4 = SomeOperation4();
    text5 = SomeOperation5();

    // This will only evaluate the text comparison for checkboxes that are checked
    if ((!checkBox1.Checked || text1 == "t1") &&
        (!checkBox2.Checked || text2 == "t2") &&
        (!checkBox3.Checked || text3 == "t3") &&
        (!checkBox4.Checked || text4 == "t4") &&
        (!checkBox5.Checked || text5 == "t5"))
    {
        SomeOperation6();
        a = 347;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...