在 DataGridView 列中使用自定义 CheckBoxComboBox

Using custom CheckBoxComboBox in DataGridView column

我需要将组合框控件与可在 DataGridView 列中选中的项目一起使用。所以我从以下 link 中找到了一个控件 https://github.com/sgissinger/CheckBoxComboBox/

其中基本的 CheckBoxComboBox 在演示中运行良好,它扩展了 DataGridViewCheckBoxComboBoxColumn class,可在 DataGridView 中用于单列。

现在在设计时将此列添加到 DataGridView 中,并启用 DataGrid 以添加新行,当将数据插入另一列并从此列中选择值时,ParseFormattedValue() 给出空异常。

另外,当使用代码添加新行时,GetFormattedValue() 会在它的值参数中给出 null 异常。

我在 DataGridView 中添加了两列,一列是简单的文本框列,另一列是 DataGridViewCheckBoxComboBoxColumn,在其中添加了星期名称。

现在,当我尝试通过

添加新行时
dataGridView1.Rows.Add();

它在 GetFormattedValue() 中显示异常,因为它的值参数中出现空值。

DataGridView中自定义CheckBoxComboBox控件的使用完成。首先,我根据您的要求添加了 DataGridViewTextBoxColumn 或任何其他内容,然后按照以下方式在该 DataGridView 中添加自定义 CheckBoxComboBox 列。 首先,您需要创建要在该组合框中显示的项目列表

 List<Status> statuses = new List<Status>();
 statuses.Add(new Status(1, "Sunday"));
 statuses.Add(new Status(2, "Monday"));
 statuses.Add(new Status(3, "Tuesday"));
 statuses.Add(new Status(4, "Wednesday"));
 statuses.Add(new Status(5, "Thursday"));
 statuses.Add(new Status(6, "Friday"));
 statuses.Add(new Status(7, "Saturday"));

然后需要创建DataGridViewCheckBoxComboBoxColumn对象

DataGridViewCheckBoxComboBoxColumn comboboxColumn = new DataGridViewCheckBoxComboBoxColumn();

从该状态列表对象创建一个 ListSelectionWrapper 对象并设置其 TextSeparator 属性。

ListSelectionWrapper<Object> wrappedList = new ListSelectionWrapper<Object>(statuses);
wrappedList.TextSeparator = comboboxColumn.TextSeparator;

将 comboboxColumn 的其他属性添加为

 comboboxColumn.DataSource = wrappedList;
 comboboxColumn.ValueMember = "Selected";
 comboboxColumn.DisplayMemberSingleItem = "Name";
 comboboxColumn.DisplayMember = "NameConcatenated";

然后在DataGridView中插入列

 dgvKioskList.Columns.Add(comboboxColumn);

在此之后,您的列将插入到您的 DataGridView 中。现在要插入一个带有预先 select 的一些列表项的新行,您需要创建一个 Dictionary 对象,例如

Dictionary<String, Object> objSelectedDays = new Dictionary<String, Object>();

例如,如果您想从 ComboBox select 星期日和星期二,您可以写

objSelectedDays.Add("Sunday", statuses[0]);
objSelectedDays.Add("Tuesday", statuses[2]);

在此之后,当您将新行与其他数据和此 objSelectedDays 对象一起插入到 DataGridView 中时,新行将添加到网格中

datagridView1.Rows.Add("ID1", objSelectedDays);

其中 "ID1" 被插入到简单的 DataGridViewTextBoxColumn

如果您想从数据网格中读取 selected 值,然后键入将单元格转换为字典对象,例如

var values = datagridView1.Rows[0].Cells[1].Value as Dictionary<String, Object>;

然后遍历值对象数组以从特定行 CheckBoxComboBox 控件中读取 selected 值