【问题标题】:DropDown list with checkboxes带有复选框的下拉列表
【发布时间】:2010-12-02 07:41:13
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: .net windows vb.net winforms


    【解决方案1】:

    您必须自行开发才能获得这种功能。

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      【解决方案3】:

      创建此效果的最简单方法是使用三个控件 - 一个编辑、一个按钮(在编辑右侧,带有一个下拉图标)和一个复选框列表,就像您现在使用的一样。

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

      1. 如果checklistbox不可见则使其可见,如果可见则使其不可见(即翻转.Visible的值)。

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

      您可以更进一步,将复选框列表放入面板容器中,并在“下拉菜单”中添加小按钮,以执行您的应用程序中可能适用的任何特殊功能(选中所有、取消选中所有等等)。

      【讨论】:

      • 使用这种方法(注意:不一定推荐),我会坚持下拉列表,但是当下拉部分打开时,覆盖一个复选框列表。
      【解决方案4】:

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

      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
      

      ColumnClick 事件在他们单击看起来像“显示/隐藏列表”按钮的内容时进行处理,而 ItemChecked 事件让我可以处理需要响应复选框中的更改的任何内容。通过访问“lvList.Items(iRowNum).Checked”值来读取每个值,其中 iRowNum 是您要检查的行。希望这可以帮助下一个需要这样的人。

      地面

      【讨论】:

        【解决方案5】:

        为 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
        

        您可能希望根据字体大小或其他内容调整上述文字值。

        【讨论】:

          猜你喜欢
          • 2015-12-12
          • 2015-11-24
          • 1970-01-01
          • 2015-03-22
          • 2016-05-05
          • 2010-10-16
          • 1970-01-01
          • 1970-01-01
          • 2010-11-23
          相关资源
          最近更新 更多