Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 76
1
.NET 4.x

Активировать кнопку при выполнении нескольких условий

02.07.2016, 15:38. Показов 7899. Ответов 12

Author24 — интернет-сервис помощи студентам
Есть два groupBox-a, в каждом из них есть по несколько checkBox-ов и textBox-ов. И есть одна кнопка допустим просто button1. Изначально для кнопки свойство Enabled поставил false. Как сделать, чтобы кнопка становилась активна, только если в groupBox1 ни один из текстбоксов (естественно только активных) не был пустым(допустим если пользователь начал вводить текст или там уже есть какой-то текст) и в groupBox2 любой из чекбоксов был чекнут? Если ни одно условие не выполняется, кнопка должна быть не активной. Если это важно, чеки и боксы (их много) добавлены в массивы chBox и tBox. Да, и мне тоже важно знать, в каком месте нужно поместить этот код или в какое событие добавить? Мне кажется лучше как-то использовать LINQ. Заранее большое спасибо.
P.S. Программу пишу на C#.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.07.2016, 15:38
Ответы с готовыми решениями:

C# как enter(om) активировать кнопку в форме?
c# как enter(om) активировать кнопку в форме??? хочу Enter нажимать и что бы оно активировала...

Сделать кнопку не активной, и после цикла активировать
Как можно правильно сделать кнопку не активной, и после цикла активировать? Даже не имею...

Выполнение нескольких условий
Подскажите плиз с данным условием. Есть 3 comboBox (медико-возростная группа, подгруппа и...

Сделать кнопку активной при выполнении условий
Приветствую всех, столкнулся с проблемой, вроде бы все просто но понять не могу что не так с...

12
Эксперт .NET
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
02.07.2016, 15:58 2
Sniper,
как вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
CheckBox[] chBox;
TextBox[] tBox;
private void Form1_Load(object sender, EventArgs e)
{
    chBox = new CheckBox[] { checkBox1, checkBox2, checkBox3, ... }; //массив чекбоксов
    foreach (CheckBox cb in chBox)
        cb.CheckedChanged += someChanged;
    tBox = new TextBox[] { textBox1, textBox2, textBox3, ... }; //массив текстбоксов
    foreach (TextBox tb in tBox)
        tb.TextChanged += someChanged;
}
 
void someChanged(object sender, EventArgs e)
{
    button1.Enabled = CheckEnabled();
}
 
bool CheckEnabled()
{
 
    foreach (TextBox tb in tBox)
        if (tb.Text==string.Empty) return false;
    foreach (CheckBox cb in chBox)
        if (cb.Checked) return true;
    return false;
}
1
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 76
02.07.2016, 16:27  [ТС] 3
Спасибо, попробую.

Добавлено через 12 минут
Начал вводить код и VS тут же подчеркнул, что someChanged не существует в данном контексте.
0
Эксперт .NET
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
02.07.2016, 16:43 4
Sniper,
см. строки 13-16
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 76
02.07.2016, 17:13  [ТС] 5
Да, надо было просто ввести весь код. После ошибок не было, но когда тестировал(отмечал чеки и вводил текст в боксы), кнопка так и оставалась не активной. Я думаю это из-за групбоксов, т.е. проверку на отмеченные чекбоксы и есть ли текст в текстбоксах надо вести обращаясь к самим groupBox-ам, а точнее к его контролам. Я пробовал так, но ничего не получается.
0
Эксперт .NET
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
02.07.2016, 17:53 6
Цитата Сообщение от Sniper Посмотреть сообщение
Я думаю это из-за групбоксов, т.е. проверку на отмеченные чекбоксы и есть ли текст в текстбоксах надо вести обращаясь к самим groupBox-ам, а точнее к его контролам.
Кто-то писал, что
Цитата Сообщение от Sniper Посмотреть сообщение
чеки и боксы (их много) добавлены в массивы chBox и tBox.
Если массивы есть и в них находятся ссылки на элементы, то группенбоксы не при чем.
Строки 5 и 8 кода записывают ссылки на элементы в массивы. Возможно ваши массивы формируются неправильно.
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 76
03.07.2016, 08:56  [ТС] 7
Массивы у меня создаются здесь
C#
1
2
3
4
5
public partial class Form1 : Form
    {
        CheckBox[] chBox;
        TextBox[] tBox;
    }
А инициализируются здесь
C#
1
2
3
4
5
6
public Form1()
        {
            InitializeComponent();
            tBox = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10 };
            chBox = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, checkBox7, checkBox8, checkBox9, checkBox10 };
        }
Добавлено через 14 часов 50 минут
Может кто ещё поможет?
Мне предложили сделать метод и запихнуть в какой-нибудь обработчик, но он не работает, да и не всё проверяет.
C#
1
2
3
4
void EnableControls()
{
   button1.Enabled = checkBox1.Checked || checkBox2.Checked;
}
Написал сам метод, закинул в Form1_Load и в groupBox1_Layout, вроде работает, но не совсем так, как мне нужно. Метод активирует кнопку, даже если в одном текстбоксе текст есть, а в другом нет. Ну и при удалении всего текста или отжатии чекбоксов, кнопка всё равно активна. Вот мой код:
C#
1
2
3
4
5
6
7
void enabledControls()
        {
            foreach (TextBox tBox in groupBox1.Controls.OfType<TextBox>().Where(x => x.TextLength > 0))
            {
                button1.Enabled = chBox.Any(x => x.Checked);
            }
        }
0
Эксперт .NET
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
03.07.2016, 11:37 8
Sniper,
Не понимаю, в чем проблема. В этом коде нечему не работать.
Если только Form1_Load к событию не подключили.
Цитата Сообщение от Sniper Посмотреть сообщение
А инициализируются здесь
Ну тогда:
C#
1
2
3
4
5
6
7
8
9
10
public Form1()
{
    InitializeComponent();
    tBox = new TextBox[] { textBox1, textBox2, textBox3, textBox4, textBox5, textBox6, textBox7, textBox8, textBox9, textBox10 };
    foreach (TextBox tb in tBox)
        tb.TextChanged += someChanged;
    chBox = new CheckBox[] { checkBox1, checkBox2, checkBox3, checkBox4, checkBox5, checkBox6, checkBox7, checkBox8, checkBox9, checkBox10 };
    foreach (CheckBox cb in chBox)
        cb.CheckedChanged += someChanged;
}
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 76
03.07.2016, 12:39  [ТС] 9
Всё равно ничего не работает. А someChanged вставил в обработчик события Form1_Load. VS пишет, что someChanged();, который я вставил в Load, не может иметь 0 аргументов.

Добавлено через 7 минут
Я попробовал ещё так, но VS пишет, что проверьте объект на значение null. Видимо текст изначально равен null и не знаю как это исправить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
void enabledControls()
        {
            
            if (tBox.Where(x => x.Enabled == true).All(x => x.Text == "") | chBox.All(x => x.Checked == false) | chBox2.All(x => x.Checked == false))
            {
                Button1.Enabled = false;
            }
            else
            {
                Button1.Enabled = true;
            }
        }
0
Эксперт .NET
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
03.07.2016, 17:00 10
Цитата Сообщение от Sniper Посмотреть сообщение
Всё равно ничего не работает.
Бывает. Карма.
Цитата Сообщение от Sniper Посмотреть сообщение
А someChanged вставил в обработчик события Form1_Load.
Зачем?
Я прикрепил архив проекта с кодом, из моего 1-го сообщения в этой теме.
В нем все работает.
Скажите, что я сделал не так?
Вложения
Тип файла: rar ButtonEnabledApp.rar (25.0 Кб, 13 просмотров)
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 76
04.07.2016, 16:32  [ТС] 11
Да, Ваш код работает. Проблема в том, что в Вашем коде кнопка становится активна, только если текст есть во всех текстбоксах, которые есть в массиве, а не только в активных. Как это исправить? А так код рабочий, спасибо.
0
Эксперт .NET
5877 / 4754 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
04.07.2016, 17:23 12
Sniper,
Упустил уточнение об активных текстбоксах:
C#
1
2
3
4
5
6
7
8
bool CheckEnabled()
{
    foreach (TextBox tb in tBox)
        if (tb.Enabled && tb.Text == string.Empty) return false;
    foreach (CheckBox cb in chBox)
        if (cb.Checked) return true;
    return false;
}
0
0 / 0 / 3
Регистрация: 31.01.2016
Сообщений: 76
04.07.2016, 18:40  [ТС] 13
Всё, сам разобрался. ) Правда код немного другой добавил, чем у Вас. )
C#
1
2
3
4
5
6
7
8
9
10
11
12
bool CheckEnabled()
        {
            foreach (TextBox tbs in groupBox1.Controls.OfType<TextBox>().Where(x => x.Enabled == true))
            {
                if (tbs.Text == string.Empty) return false;
            }
            foreach (CheckBox chb in chBox)
            {
                if (chbs.Checked) return true;
            }
            return false;
        }
Спасибо большое за помощь. )
0
04.07.2016, 18:40
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.07.2016, 18:40
Помогаю со студенческими работами здесь

Поиск значения при выполнении условий и нескольких параметров
Добрый день!!! Ломаю голову целый день.... помогите пожалуйста!!!! Мне кажется, это не трудно,...

Открытие формы при выполнении условий
Форумчане, приветствую! изделие на ремонт, возможно ли сформировать процедуру которая будет...

Пересечение условий при выполнении условного оператора
Доброго времени суток. Начну немного издалека. Решил я заняться изучением какого-нибудь языка...

Возврат содержимого ячейки при выполнении условий
Добрый день, господа! Подскажите пожалуйста, я правда делаю таблицу в Гугл докс, но не столь...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru