返回首页

{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的子属性,它允许您更改复选框的外观,例如平,文本对齐,等。

回答

评论会员:托尼Mamacos 时间:2011/12/15
真棒控制,非常感谢

我做了一个变化的控制,停止初始单击选择需要。

BeginInvoke(new MethodInvoker(ShowDropDown));

ShowDropDown();

WndProc(ref Message m)

PopupComboBox.cs
评论会员:ahmadamiri 时间:2011/12/15
{S3}
评论会员:denfer06 时间:2011/12/15
您好

我有我的复选框,组合框绑定到一个数据源,并一切正常。

的问题时我删除数据源(设置为NULL),然后重新绑定到同一个数据源(包含新的价值)
this.cb_Customer.DataSource = null;
在这种情况下,我有好正确的项目,但文本属性不为空(""){ BR}
我没有这个beaviour当我填的是combox手动使用
foreach (DataRow userdr in DT.Rows)

                {

                    this.cb_Customer.Items.Add(userdr["CustomerName"]);

                }

你有什么想法,什么地方出了错?
也许我不解除绑定正确的数据
评论会员:viralsarvaiya 时间:2011/12/15

您好,

我尝试checkboxcombobox,它;好和对我的工作,在我的应用程序
{ BR},但我有一个问题,

当我打开的DropDownList,它打开复选框列表,当我按一下检查的复选框第一时间,可以不检查和然后我单击复选框第二时间,它检查和那么在第一次点击其他复选框通常检查,然后我靠近,下拉和另一个时间我打开下拉和然后同样的问题清单发生,首次它可以不检查"复选框

我检查的代码,但我不能为什么发生

请帮我在它


NBSP等待你的答复。

NBSP提前感谢{ BR} TR
病毒Sarvaiya
评论会员:dyocom 时间:2011/12/15
这是一个很大的控制。我探索的特点,它是惊人的。

但是,我不知道为什么复选框标准CheckedListBox控件,而不是使用。

无论如何,我会尝试这一个
评论会员:。Redband 时间:2011/12/15
?这究竟是不允许你访问的实际ValueMember,然后按

如果我有一个列表,我要显示的文本,但其实我是想知道这些项目中的每一个记录ID?

例如,
值;显示
1,第1项
2,项目B
3,项目Z

我要显示的显示列,但我想知道哪些值(1,2,3),他们选择了
评论会员:。cybergroove 时间:2011/12/15
大控制,真正使我从一个非常杂乱的UI
。同时也感谢Wout为他的"焦点"的解决方案
德泽乌
评论会员:。DogSpots 时间:2011/12/15
这一个伟大的控制

但是... ...导航向上和向下箭头的复选框,似乎有点"上下":我预计按住,将焦点移到下面的复选框,而不是向上移动
。 一个属性来改变方向(使用VS2010中,我监督。NET 2.0 WIN XP)?
/乌尔夫
评论会员:cybergroove 时间:2011/12/15
有没有人找到解决这个问题呢?
感谢
评论会员:创新 时间:2011/12/15
我花了我一天的大部分今天试图找出这一点。我无法找出重点去一次弹出可见。我试过看的复选框,弹出框和组合框的按键没有,如果他们所得到的按键。
这是非常令人沮丧。
我会让你知道如果我找到了一些东西。
请做同样的,如果你找到的东西。
干杯
评论会员:。sandi_125 时间:2011/12/15
我发现围绕这个问题的工作。我分配两个事件处理程序时动态创建的控制:

AddHandler ddl.CheckBoxItems.KeyDown, AddressOf CBI_KeyDown

AddHandler ddl.CheckBoxItems.PreviewKeyDown, AddressOf CBI_PreviewKeyDown

然后,我创建了PreviewKeyDown事件,只允许某些键触发事件:

Private Sub CBI_PreviewKeyDown(ByVal sender As CheckBoxComboBoxItem, ByVal e As PreviewKeyDownEventArgs)

    If e.KeyValue = 9 Or e.KeyValue = 38 Or e.KeyValue = 40 Then

        e.IsInputKey = True

    End If

End Sub

然后我创建的KeyDown事件,我也注意到左,右的箭头键导航控制,所以我用SendKey函数发送时使用向上和向下箭头左右键:

Private Sub CBI_KeyDown(ByVal sender As CheckBoxComboBoxItem, ByVal e As KeyEventArgs)

    If e.KeyValue = 9 Then

        ddlControl.HideDropDown()

        SendKeys.Send("{TAB}")

    ElseIf e.KeyValue = 40 Then

        SendKeys.Send("{LEFT}")

    ElseIf e.KeyValue = 38 Then

        SendKeys.Send("{RIGHT}")

    End If

End Sub

我希望这有助于
评论会员:Imdabaum 时间:2011/12/15
您好,

良好的控制...有一个快速的问题... ...可以这样添加DataGridView的细胞内?

关于
开发
Deviprasad V
评论会员:Dasiths 时间:2011/12/15
嗨,你做到这一点
评论会员:?Redband 时间:2011/12/15
喜。我有一些问题,让这个工作。演示的伟大工程,但是当我尝试在我的项目中使用此控制线389打破 - base.WndProc(REF米):出现FormatException未处理的字符串作为一个有效的布尔认可。 Popup.cs文件。

有没有人能够添加的CheckboxCombobox.dll它们的引用,并能够使用在一个单独的vb.net项目的控制吗?我已阅读,DLL是在任何兼容的。NET语言,但没有作为尚未试图重写整个应用程序在C#。也许是我虽然

只需要得到一些指针设置
评论会员:db_developer 时间:2011/12/15
添加类库引用

然后创建一个新的类在自己的项目。

进口PresentationControls

公共类CheckBoxDropDown
继承PresentationControls.CheckBoxComboBox

公共功能getSelectedItems名单(对象)
作为新的列表DIM X(对象)

对于每一个Me.CheckBoxItems
Ø由于CheckBoxComboBoxItem 如果o.Checked
x.Add(o.ComboBoxItem)
最终如果
下一步

 0; 返回x
结束函数

公共小组的setSelected(O)为对象,为布尔彗星
尝试
如果Me.CheckBoxItems.Where(功能(P)p.ComboBoxItem.Equals(O))。计数> 0
Me.CheckBoxItems.Single(功能p.ComboBoxItem.Equals(O))(P)。托运= C
最终如果

  ; 赶上前为例外

 0; END TRY
END SUB

公共功能GetSelected(为对象o)布尔
尝试
如果Me.CheckBoxItems.Where(功能(P)p.ComboBoxItem.Equals(O))。计数> 0
 0; 返回Me.CheckBoxItems.Single(功能p.ComboBoxItem.Equals(P)(O))。托运
&# 160; ELSE
返回False
 60; 最终如果

赶上前为例外
返回False
 60; END TRY
结束函数

尾类
提示"请花时间阅读我的文章"
评论会员:雷蒙德卡斯特罗 时间:2011/12/15
我没有使用VB(2010)等问题
。复制DLL到我的项目目录。
添加引用到DLL。
新增的DLL到工具箱中。
拖到我的形式。
新增进口PresentationControls

可以使用没有问题的控制{S3}
评论会员:db_developer 时间:2011/12/15
?我怎样才能获得所有选定的项目的ID
thnx

我的意思是状态对象的情况下,例如

1。直到去年实现迭代组合项目
cmbIListDataSource.CheckBoxItems

2。检查
3。获得ID

4。加上id清单,并得到了步骤#1
是唯一的选择,以获得选定的IDS?
2011年1月6日(星期四),下午03:44
修改
评论会员:flabegalini 时间:2011/12/15
,您可以通过这个代码的所有选定的项目字符串[] selectedItems =新的字符串[testbox.CheckBoxItems.Count]
  ; (I = 0;我& #160; {
(testbox.CheckBoxItems [I]。托运)
& #160; {
selectedItems [I] = testbox.CheckBoxItems [i]文字;
 0; }
}
我把一个数组矿,但当然,你可以把它放在任何地方,你想。我希望这可以帮助您。 {五}

的问候,
雷蒙德
评论会员:pcphuc 时间:2011/12/15
高selfdocumented
广泛的功能
稳定
用法示范项目提供
控制非常理想优秀
评论会员:sparky2778 时间:2011/12/15
您好,感谢这篇文章,是一个伟大的的控制,我已经看了类似的东西长时间。但是我发现一个"错误",我不能够解决。当字体大小越大,控制显示了一个薄薄的弹出前的复选框列表显示。有没有办法解决呢?

谢谢!修改日(星期二),12月21日,2010 8:51
评论会员:xinkmt 时间:2011/12/15
嗨马丁Lottering,

首先,我必须说,这是一个从你的伟大控制。我的投票5。
但我现在面临着与您的控制问题
在我的形式,也有一些文本框和之一CheckBoxCombobox。当我点击您的Combobox中,所有文本框是只读状态。我不知道为什么和不知道如何解决它。

希望尽快得到您的答复,

pcphuc
评论会员:denimenom 时间:2011/12/15
下载不能正常工作。它只是给你带来相同的页面
评论会员:。SandeepCholattu 时间:2011/12/15
普通