Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150

Как привязать CheckBox к Enum и DataBinding

26.11.2021, 16:20. Показов 1650. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу создать чекбоксы, которые представляют собой объекты из Enum, и при check\unCheck каждого из них Enum применяется, а вернее, добавляется к листу другого объекта, который имеет поле-лист
есть enum и class который имеет поле-список этих enum
C#
1
2
3
4
5
6
7
8
9
10
11
public enum Days
{
none,
monday,
thuesday,
}
 
public class Calendar
{
public List<Days> someDays {get; set;} = new List<Days>();
}
Есть панель, которая имеет чекбоксы на основе всех элементов enum
C#
1
2
3
4
5
6
7
8
9
10
11
12
foreach (Days day in Enum.GetValues(typeof(Days)))
            {
                Point point = new Point(8, 0); // стартовая точка на панели
                Point distanceBewtween = new Point(0, 20); // дистанция-отступ, чтобы не накладывались чекбоксы
                CheckBox cb = new CheckBox();
                cb.Name = $"cb{day}"; // имя как элемент enum
                cb.Text = day.ToString();
                cb.Location = point;
                point.X = point.X + distanceBewtween.X;
                point.Y = distanceBewtween.Y + point.Y; // создали отступ
                pnlDays.Controls.Add(day); // добавили на панель
            }
Задача: при чеке\анчеке любого чекбокса найти этот чекбокс из панели, представить его как enum, и добавить его значение в созданный объект
Примерное решение, которое некорректно, но подразумевает мысль:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
{
Calendar cld = new Calendar();
 
List<CheckBox> list = new List<CheckBox>();
            foreach (var item in pnlTags.Controls.Find("CheckBox", false))
            {
                list.Add((CheckBox)item);
            }
 
foreach (Days day in (Days)list)
{
cld.someDays.Add(day)
}
Controls.Find("CheckBox", false)) - что требуется? Имя класса (CheckBox) или имя объекта (cb{day})?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.11.2021, 16:20
Ответы с готовыми решениями:

РЕШЕНО Enum Как привязать пересляемые константы к переменной
Как привязать перечисляемые константы к переменной, чтобы при использовании константы другой переменной, была ошибка компиляции? Пример: ...

Как привязать CheckBox к ячейке?
Добрый день. Не мог бы кто-нибудь пояснить некоторые моменты. Со вчерашнего вечера не могу уложить в голове следующее. 'Добавить...

Как привязать CheckBox к Button2?
Как? привязать код к кнопке &quot;Отключить&quot; она же (button2): private void button1_Click(object sender, EventArgs e) { ...

6
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
26.11.2021, 16:40
Лучший ответ Сообщение было отмечено Pandamonk как решение

Решение

Цитата Сообщение от Pandamonk Посмотреть сообщение
если Text чекбокса совпадает с каким-нибудь элементом из Days, то этот элемент применяется
1)Есть такое свойство как Tag, в него вы можете запихнуть любой объект.
2)Вы можете создать один обработчик checkedChanged и подключи все созданные checkBox`ы
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void State_CheckedChanged(Object sender, EventArgs e) {
 
//Теперь когда будет событие вкл или выкл, в данном обработчике у вас произойдет событие.
   CheckBox ch = sender as CheckBox;
   //затем вы можете проверить состояние 
   if(ch.Checked)
   { 
      //Если отмеченный то получаем значение свойства tag
      var value = ch.Tag;
 ////.............................
   }
  
}
1
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
26.11.2021, 19:02  [ТС]
Это сработало, но я столкнулся со странной визуальной проблемой, суть которой пока что не важна - в процессе решения наткнулся на ListCheckBox, и попробовал его.
Days то добавил
C#
1
foreach (Days day in Enum.GetValues(typeof(Days))) checkboxlist.Items.Add(day);
Но не понимаю, как одновременно выбрать в перечислении и Item как Days, и его состояние (checked\unchecked)

Добавлено через 22 минуты
Окей, методом перебора пришел к этому:
C#
1
2
3
4
5
6
7
8
9
10
11
private void checkboxlistDays_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Checked)
            {
                cld.someDays.Add((Days)e.Index);
            }
            if (e.NewValue == CheckState.Unchecked)
            {
                cld.someDays.Remove((Days)e.Index);
            }
        }
0
 Аватар для Kazbek17
1484 / 939 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
26.11.2021, 19:08
Pandamonk,
C#
1
2
3
4
5
6
7
8
 private void Checkboxlist_ItemCheck(object sender, ItemCheckEventArgs e)
        {
            if (e.NewValue == CheckState.Checked)
            {
                string day = checkboxlist.SelectedItem.ToString();
                MessageBox.Show(day);
            }
        }
Добавлено через 1 минуту
еще есть
C#
1
checkboxlist.CheckedItems //коллекция отмеченных элементов
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
26.11.2021, 19:30  [ТС]
Хорошо, а как теперь чекать\анчекать items из listcheckbox при смене экземпляра класса?
В случае с checkbox это было так
C#
1
2
3
4
5
var value = ch.Tag;
if (calendar1.someDays.Contains(value)
   ch.Checked = true;
else
   ch.Checked=False;
Короче, все тоже самое, но в обратную сторону. Появляется экземпляр класса (из файла), который уже содержит заполненный someDays - нужно установить положение чекбоксов на основе этого.

Сейчас я использую это
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void UpdateCheckBox()
        {
            int a = 0;
            foreach (var item in listcheckbox.Items)
            {
                if (calendar1.someDays.Contains((Days)item))
                {
                    listcheckbox.SetItemChecked(a, true);
                }
                else
                {
                    listcheckbox.SetItemChecked(a, false);
                }               
            }
        }
Но получаю ошибку
Code
1
System.InvalidOperationException: "Список, к которому привязан данный перечислитель, был изменен. Перечислитель может использоваться, только если список не изменяется."
Которая видимо подразумевает, что один из элементов сменил значение checked во время перечисления foreach
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
26.11.2021, 22:30  [ТС]
Визуальный баг, который я ловлю с несколькими чекбоксами, выглядит так:
Зеленый - обычный текстбокс, красный - текстбокс, созданный в panel.Controls, у каждого красного текстбокса текст съехал к чертям на неск пикселей выше
Изображения
 
0
3 / 2 / 2
Регистрация: 26.05.2021
Сообщений: 150
26.11.2021, 23:28  [ТС]
Разобрался с каждой проблемой, тема не актуальна
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.11.2021, 23:28
Помогаю со студенческими работами здесь

Как привязать изображения к checkBox?
При нажатии на изображение ОТКЛ должна появиться галка на checkBox и показать изображение ВКЛ, при повторном нажатии галка должна исчезнуть...

Как привязать к значению CheckBox элемент массива?
Подскажите, как привязать к значению CheckBox элемент массива - по идее, это ControlSource. В каком виде туда надо ввести имя массива или...

Как привязать определенную ячейку из таблицы к CheckBox?
Задание такое , Нужна программа имеющая БД со списком ФИО (ФИО можно добавлять удалять).Должно быть от 3 до 5 Label с редактируемым...

Как привязать значение переменной к значению CheckBox
bool que1q = false, que2q = false, que3q = false, que4q = false, que5q = false, que6q = false, que7q = false, que8q = false, que9q = false,...

Привязать checkbox к значению в поле
Добрый день! Требуется в зависимости от значения checkbox вставить в поле null. Если не отмечен то вставить null. И наоборот в зависимости...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru