{S0}简介
我需要一种方法,以尽量减少由过滤器控制所需的空间,还最大限度地向用户提供过滤功能。做到这一点的一种方式,以取代与CheckBoxComboBox控制的CheckBox控件的分组框。有几个CheckBoxComboBox控制,在网络上,但我发现和测试的所有缺了点什么。
一些控制模拟一个复选框只画在弹出的,这意味着的复选框没有像一个复选框应该和它造成的弹出窗口关闭之前,用户可以做出更多的选择。其他控件没有专门正常的ComboBox,所以你失去了一个ComboBox控件的现有功能和其项目,例如,你无法将控件绑定到自定义数据源了。
CheckBoxComboBox结合,与真正的复选框标准。NET的ComboBox,并通过创建一个包装ComboBox.Items(它不使用CheckBoxListBox)完成这个任务。这里值得一提的另一点,还在于它采用整齐的弹出法比安斯基Swiatkowski提供的解决方案,你可以找到{A}。这解决了一些重点这样的自定义所有者的形式,调整大小功能,定位,等真正值得看的弹出删除的问题。背景
CheckBoxComboBox提供其中包含列表中显示的复选框,以及ComboBox项的链接对象,它链接到一个CheckBoxItems财产。此外,它有一个CheckBoxCheckedChanged气泡的复选框项的CheckedChanged事件的事件返回到ComboBox。使用代码
使用的代码很简单,你可以填充ComboBox的像你会做通常填充手动或链接到一个DataSource。
但是,请确保你想想以下,特别是如果你是有约束力的控制。目前,您可能有一个对象,你想在用户作出选择的CheckBoxComboBox弹出窗口列表的列表。这种选择需要一个布尔值属性绑定时,将重新设置为绑定对象。该对象是否真正关心是否选定的地方?如果你不仅要选择的对象,但也希望增加额外的显示信息,如这些对象有多少可用,会发生什么?所有这些额外的信息可以搞乱你的对象是不必要的。所以,我包括一个附加的类,你可以用它来为你解决。基本上,它需要你的对象列表,并增加了一个选择和Count属性为你没有这些属性添加到您现有的对象,它实际上是不相关的操作。这些属性,然后,您可以轻松地扩展或改变自己的行为,而不影响您的当前类。 (它的独立和清洁。)下面的代码演示其使用一个自定义Listlt; TGT;和DataTable,但唯一的要求是一个IEnumerable类型。#region POPULATE THE "MANUAL" COMBO BOX
cmbManual.Items.Add("Item 1");
cmbManual.Items.Add("Item 2");
cmbManual.Items.Add("Item 3");
cmbManual.Items.Add("Item 4");
cmbManual.Items.Add("Item 5");
cmbManual.Items.Add("Item 6");
cmbManual.Items.Add("Item 7");
cmbManual.Items.Add("Item 8");
#endregion
上面的代码示例是简单,8个字符串对象添加到ComboBox中,你通常会做。{C}
在这种提取物,Listlt; Statusgt;对象是绑定到列表中。注意它不是直接绑定的,我用的ListSelectionWrapperlt; TGT;处理对我的选择,因为我不想修改现有的quot;重新usablequot;状态类。#region POPULATED USING A DATATABLE
DataTable DT = new DataTable("TEST TABLE FOR DEMO PURPOSES");
DT.Columns.AddRange(
new DataColumn[]
{
new DataColumn("Id", typeof(int)),
new DataColumn("SomePropertyOrColumnName", typeof(string)),
new DataColumn("Description", typeof(string)),
});
DT.Rows.Add(1, "AAAA", "AAAAA");
DT.Rows.Add(2, "BBBB", "BBBBB");
DT.Rows.Add(3, "CCCC", "CCCCC");
DT.Rows.Add(3, "DDDD", "DDDDD");
cmbDataTableDataSource.DataSource =
new ListSelectionWrapper<DataRow>(
DT.Rows,
// "SomePropertyOrColumnName" will populate the Name
// on ObjectSelectionWrapper.
"SomePropertyOrColumnName"
);
cmbDataTableDataSource.DisplayMemberSingleItem = "Name";
cmbDataTableDataSource.DisplayMember = "NameConcatenated";
cmbDataTableDataSource.ValueMember = "Selected";
#endregion
在第三个例子,我也使用ListSelectionWrapperlt; TGT,因为我的表没有一个选择列。但是请注意,我不换行的DataTable,我包裹住行,而是这是IEnumerable。初始化的包装时,我指定"SomePropertyOrColumnNamequot;,因为包装使用toString()方法的对象上,通常将导致一个DataRow quot; System.Data.DataRowquot,而不是真正的的文本,你想显示。如果你不希望他们使用toString(),您可以使用此属性说明符表示PropertyDescriptor的正常财产或其他物体比一个DataRow。这可能是有用的。
如果你想知道哪些项被选中,你有两个选择:这是一个包装每个项目在ComboBox.Items列表中的项目清单上的ComboBox CheckBoxItems财产。 CheckBoxComboBoxItem类是一个标准的复选框,并因此在托运中的bool值,您正在寻找。或者,如果你存储一个ListSelectionWrapperlt参考; TGT;,你可以用它来访问Selected属性的绑定列表。if (ComboBox.CheckBoxItems[5].Checked)
DoSomething();
OR
if (StatusSelections.FindObjectWithItem(UpdatedStatus).Selected)
DoSomething();
如果一个CheckBoxComboBox没有意义的,或似乎有必要,可以考虑作为一个现实世界的例子,下面的过滤器。
这里显示的组合框,取代它下面的一组框所示。
有没有这种控制的空间:{S2}兴趣点
我本来是一个宗教Delphi开发,使这种控制工作教会了我很多一个关于C#和。NET。一直ComboBox的,仍是一个难以控制,自定义,这样才能证明占用你的时间更多的时间比你预期的。
来源以下列表可以帮助你尝试,也包含其他ComboBox控件复选框的链接:历史2007-11-06改变弹出帧和持续时间为零,以修复黑色闪烁。我想不通的方式来解决它的淡入淡出效果,同时保持。解决了复选框的选中状态尚未被分配回的绑定属性前CheckBoxCheckedChanged事件引发的问题。我现在这个值分配回自己,如果ComboBox使用一个DataSource。增加了一个类来包装现有的列表,所以我并不需要添加不必要的选择属性,在不需要它的类。这个列表包装不支持IBindingList的来源,因此,如果您在您的名单中实现该接口,此包装将保持在与您的列表同步自动。但是,它不是一个要求,在所有。选择包装也有利于工作与计数。更改CheckBoxItems同步访问属性时,使选中的值可以被初始化之前弹出显示。2007-11-22新增一个名为CheckBoxProperties ComboBox的子属性,它允许您更改复选框的外观,例如平,文本对齐,等。