2009-09-29 142 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 

您可能想根據字體大小或其他來調整上述文字值。