2009-09-29 107 views
5

如何制作带复选框的下拉列表? 我有一个Windows应用程序(vb.net)和checkboxlist控件是不是真正的选项与我的表单上的可用空间。带有复选框的DropDown列表

谢谢。

回答

1

创建这种效果的最简单方法是使用三个控件 - 编辑,按钮(在编辑的右侧,下拉图标)和checkboxlist。

将复选框列表置于编辑下方,使其宽度与编辑和编辑旁边的按钮相同,并使其不可见。现在,该按钮添加代码:

  1. 充分利用checklistbox可见,如果它是不可见的,并使其不可见的,如果它是可见的(即,翻转。可见的值)。

  2. 调用代码来创建被检查内容的“汇总”版本,而不是检查并在编辑中显示它。例如,如果您的“下拉列表”包含颜色名称,则可能会让您的代码创建一个以逗号分隔的已检查颜色列表,并在编辑中显示该列表。

您可以借此远一点,把的CheckBoxList到面板容器,并添加小按钮到“下拉菜单”来执行任何特殊功能可能会在您的应用适当地(可复选,取消所有,任何)。

+0

使用这种方法(注意:不一定推荐),我会坚持下拉列表,但是当下拉部分打开时,覆盖复选框列表。 – 2009-09-29 15:37:31

+0

这是一个非常好的主意,非常感谢 – Iulian 2009-09-29 19:08:54

4

你必须去所有者绘制才能获得这种功能。

如果您的表单空间不足,我会建议先查看是否可以重构GUI以使其更简单。

+1

重构gui的+1。 – 2009-09-29 13:07:10

1

我怀疑你的问题可能被编辑,因为它目前还不是很清楚。我猜你想要在窗体上的下拉列表控件,但是当列表下拉时,你有复选框作为其中的选项?如果是这样,我怀疑你可能正在查看一组自定义的控件(例如Telerik控件将允许你为一个RadComboBox模板),但我不认为有任何标准控件可以允许这样做。

+0

是的,我想用组合框填充下拉列表,就像在excel 2007中的过滤器对话框一样。 购买它是有点没用,我的应用程序的整个点是练习和学习在vb.net做一些事情 – Iulian 2009-09-29 15:08:46

+0

我倾向于在asp.net世界中工作,但以下内容是在谷歌搜索中找到的 - 也许其中一些代码可以帮助您学习,特别是SO上的第一个线程看起来不错: http :http://stackoverflow.com/questions/859227/looking-for-a-wpf-combobox-with-checkboxes http://wpfcolorpicker.codeplex.com/ http://blogs.msdn.com/llobo/archive/ 2006/10/25/Split-Button-in-WPF.aspx http://www.eggheadcafe.com/tutorials/aspnet/e8585e81-34c8-4808-ae3e-b8b35d738842/wpf-datagrid-as-combobox.aspx – 2009-09-30 08:46:11

+0

你如何模仿RadComboBox? – 2012-07-25 04:08:58

0

我已经找到了一个关于如何做到这一点的CodeProject文章(更像是“已经做成”,但至少我可以戳代码,并了解他是如何做到的) 我不知道我是如何错过早。

这里是link

2

我发现一个更简单的解决方案,并认为我会发布它,如果有人像我一样搜索可以使用它。我所做的是将单列Listview插入到我的表单中,其中View设置为Detail模式,MultiSelect设置为True,Checkboxes设置为True。以下代码将允许列表下拉。由于我有多重选择,因此不需要像在组合框中那样显示选定值,因此下拉菜单显示为显示/隐藏列表的按钮。在下面的代码中,我将高度除以4,因为我的列表是静态的,那就是我列表中有多少个复选框。如果你有一个动态列表,那么只需从列表视图中读取项目的数量并使用它。你可能需要使用它来获得你想要的外观。下面是我使用的事件:

Dim iListHt As Integer 'Set global variable to save height of list 

     'Save initial height of list and then collapse it to a button 
     iListHt = lvList.Height 
     lvList.Height = CInt(iListHt/4) 
     lvList.Columns(0).Text = "Display List" 

Private Sub lvList_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles lvList.ColumnClick 
    Dim iHt As Integer = lvList.Height 
    If (iHt < iListHt) Then 
     lvList.Height = iListHt 
     lvList.Columns(0).Text = "Hide List" 
    Else 
     lvList.Height = CInt(iHt/4) 
     lvList.Columns(0).Text = "Display List" 
    End If 
    lvList.Refresh() 
End Sub 

Private Sub lvList_ItemChecked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles lvList.ItemChecked 
    'Read values from list check boxes and update settings 
    UpdateSettings() 
End Sub 

当他们点击什么样子的显示/隐藏列表按钮和ItemChecked事件让我来处理任何需要在复选框的变化作出反应的ColumnClick事件句柄。每个值都通过访问“lvList.Items(iRowNum).Checked”值来读取,其中iRowNum是要检查的行。希望这有助于下一个需要这样的人。

hground

0

道具hground使用一个ListView用于这一目的。我会尽力给出他的概念的改进版本。

Private Shared Sub Expand(lv As ListView) 
    Dim expandedHeight As Integer = 20 + (15 * lv.Items.Count) 
    lv.Height = expandedHeight 
End Sub 
Private Shared Sub Contract(lv As ListView) 
    Dim contractedHeight As Integer = 20 
    lv.Height = contractedHeight 
End Sub 
Private Sub uiIssuesStatusListView_GotFocus(sender As Object, e As System.EventArgs) _ 
Handles uiIssuesStatusListView.GotFocus, uiIssuesStatusListView.ColumnClick 
    Call Expand(uiThisListView) 
End Sub 
Private Sub uiIssuesStatusListView_LostFocus(sender As Object, e As System.EventArgs) _ 
Handles uiIssuesStatusListView.LostFocus, uiIssuesStatusListView.MouseLeave 
    Call Contract(uiThisListView) 
End Sub 

您可能想根据字体大小或其他来调整上述文字值。