Как связать Enum из DataTable для выигрыша форм CheckedListBox
Вопрос
у меня есть такой сценарий:
[Flags]
enum Colors : long
(
red = 1,
blue = 2,
green = 4,
yellow = 8,
)
DataTable dt = new DataTable();
dt.Columns.Add("PersonName", typeof(string));
dt.Columns.Add("CheckOption", typeof(bool));
dt.Columns.Add("Colors", typeof(long));
// note that the values in the Colors column are enumed values of chosen colors
dt.Rows.Add("Name 1", true, 1); // red
dt.Rows.Add("Name 2", true, 12); // green and yellow
dt.Rows.Add("Name 3", true, 4); // green
dt.Rows.Add("Name 4", false, 11); // red, blue and yellow
// bind the datatable to grid
DataGridView dgv = new DataGridView();
dgv.DataSource = dt;
// hide the colors in the grid
dgv.Columns["Colors"].Visible = false;
// checked list box has all items from the enum
CheckedListBox clb = new CheckedListBox();
string[] colorsArray = Enum.GetNames(typeof(Colors));
clb.Items.AddRange(colorsArray);
мне бы хотелось каким-то образом правильно привязать перечисляемое значение выбранных цветов в столбце «Цвета» таблицы данных к CheckedListBox.Является ли это возможным?
до сих пор я играл с событием RowEnter сетки, но это кажется очень хрупким и совсем не приятным.
РЕДАКТИРОВАТЬ:например, если бы у меня был четвертый столбец в таблице данных под названием MyText, я мог бы привязать этот столбец к текстовому полю следующим образом:
myTextBox.DataBindings.Add("Text", dt, "MyText");
при перемещении по строкам в сетке данных значение в текстовом поле автоматически изменяется, и любые обновления текстового поля сохраняются обратно в таблицу данных.Я хотел бы получить эту функциональность из контрольного списка и перечислений.
Решение
Не существует простого способа сделать это, поскольку это не типичный сценарий основных деталей.Думаю, вам все-таки стоит начать писать этот код.
Другие советы
Я не совсем понимаю, что вам нужно, но можете ли вы использовать жадный алгоритм, чтобы определить, какие цвета используются?
Например, у вас есть число 11.Единственный возможный способ получить 11 — использовать желтый цвет, поэтому вы удаляете самое большое подходящее число (8) и устанавливаете соответствующий флажок.Тогда вы получите 3.Наибольшее подходящее число — 2 (синее), тогда остаток очевиден.