Como ligar Enum de DataTable para ganhar formas CheckedListBox
Pergunta
eu tenho este cenário:
[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);
O que eu gostaria é de alguma forma vincular o valor enumed de cores escolhidas na DataTable "cores" de coluna para o CheckedListBox em um bom caminho. é possível?
Até agora eu tenho jogado com o evento RowEnter da grelha, mas isso parece muito frágil e não muito bom em tudo.
EDIT: por exemplo, se eu tinha um quarto da coluna na tabela de dados chamada MyText eu poderia ligar a coluna a uma caixa de texto como este:
myTextBox.DataBindings.Add("Text", dt, "MyText");
quando se deslocam através das linhas em um datagrid o valor nas alterações caixa de texto Automaticamente e quaisquer atualizações para o caixa de texto são salvos de volta para a tabela de dados. eu gostaria de obter este functionalty do CheckListBox e enums também.
Solução
Não há nenhuma maneira fácil de fazê-lo como este não é um cenário típico de detalhes mestre. Eu acho que você deve começar a escrita que afinal código.
Outras dicas
Eu não sei exatamente o que você está depois, mas você pode usar um algoritmo guloso para determinar quais as cores que estão sendo usados?
Por exemplo, você tem o número 11. A única maneira possível de obter 11 é por ter amarelo, de modo a remover o maior número que se encaixa (8), e marque a caixa de seleção correspondente. Então você começa 3. Maior número que se encaixa é 2 (azul), em seguida, o restante é óbvio.