代码之家  ›  专栏  ›  技术社区  ›  Mladen Prajdic

如何将枚举从DataTable绑定到Win Forms CheckedListBox

  •  1
  • Mladen Prajdic  · 技术社区  · 17 年前

    我有这样的场景:

    [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);
    

    我想要的是以一种很好的方式将DataTable“颜色”列中所选颜色的枚举值绑定到选中的列表框。 有可能吗?

    到目前为止,我一直在玩网格的RowCenter事件,但这看起来很脆弱,一点都不好。

    编辑: 例如,如果数据表中有一个名为mytext的第4列,我可以将该列绑定到如下文本框:

    myTextBox.DataBindings.Add("Text", dt, "MyText");
    

    当移动数据报中的行时,文本框中的值会自动更改,对文本框的任何更新都会保存回数据表。 我想从复选列表框和枚举中获取此功能。

    2 回复  |  直到 17 年前
        1
  •  1
  •   Miha Markic    17 年前

    没有简单的方法可以做到这一点,因为这不是一个典型的主细节场景。我想你还是开始写代码吧。

        2
  •  -1
  •   Jean Azzopardi    17 年前

    我不太确定你在追求什么,但你能用贪婪的算法来决定使用哪种颜色吗?

    例如,你有11号。唯一可能获得11的方法是使用黄色,因此您删除了适合的最大数字(8),并选中相应的复选框。然后你得到3。最适合的数字是2(蓝色),那么其余的数字是显而易见的。