2009-09-29 18 views
5

Come posso creare un elenco a discesa con caselle di controllo? Ho un'app windows (vb.net) e il controllo checkboxlist non è un'opzione reale con lo spazio disponibile sul mio modulo.Elenco DropDown con caselle di controllo

Grazie.

risposta

1

Il modo più semplice per creare questo effetto consiste nell'utilizzare tre controlli: un pulsante di modifica, un pulsante (a destra della modifica, con un'icona a discesa) e un checkboxlist come lo state usando ora.

Posizionare la casella di controllo sotto la modifica in modo che la sua larghezza corrisponda alla modifica e al pulsante accanto alla modifica e renderla invisibile. Ora, aggiungere il codice per il pulsante per:

  1. Fai il CheckListBox visibile se non è visibile e di renderlo non visibile se è visibile (cioè, capovolgere il valore della .Visible).

  2. Codice di chiamata per creare una versione "riepilogata" di ciò che è stato controllato e non controllare e visualizzarlo nella modifica. Ad esempio, se il "menu a discesa" contiene nomi di colori, è possibile che il codice crei un elenco delimitato da virgole dei colori controllati e lo visualizzi nella modifica.

Si può prendere questo un po 'oltre e mettere il CheckBoxList in un contenitore pannello e aggiungere piccoli bottoni alla "discesa" per eseguire qualunque funzioni speciali potrebbe essere opportuno nella vostra applicazione (selezionare tutte, deselezionare tutti, qualunque sia).

+0

Utilizzando questo tipo di approccio (nota: non necessariamente raccomandato), rimango con l'elenco a discesa, ma quando si apre la parte a discesa, sovrapponi un elenco di caselle di controllo. –

+0

questa è un'ottima idea, grazie mille – Iulian

4

Dovresti fare il proprietario disegnato per ottenere quel tipo di funzionalità.

Se il modulo è fuori dallo spazio, suggerirei prima di cercare se è possibile rifattorizzare la GUI per renderla più semplice.

+1

+1 per refactoring del gui. –

1

Sospetto che la tua domanda possa essere modificata poiché al momento non è molto chiara. Sto indovinando che vuoi un controllo elenco a discesa sul modulo, ma quando l'elenco scende hai caselle di controllo come le opzioni al suo interno? Se è così, ho il sospetto che tu stia guardando un set personalizzato di controlli (i controlli Telerik ti permetteranno di modellare un RadComboBox per esempio), ma non penso che ci siano controlli standard che permetteranno questo.

+0

Sì, mi piacerebbe creare un elenco a discesa popolato con caselle combinate, come la finestra di dialogo del filtro in Excel 2007. Acquista è un po 'inutile, l'intero punto della mia app è praticare e imparare a fare alcune cose in vb.net – Iulian

+0

Tendo a lavorare nel mondo di asp.net, ma con una ricerca su google sono stati trovati i seguenti: forse alcuni di essi avranno il codice che può aiutarti nell'apprendimento, in particolare il primo thread su SO sembra buono: 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 –

+0

Come si maschera un RadComboBox? –

0

Ho trovato un articolo su CodeProject su come farlo (più come "già fatto" ma almeno posso sondare il codice e imparare come lo ha fatto) Non so come mi sono perso in precedenza.

Questo è il link.

2

Ho trovato una soluzione più semplice e ho pensato di pubblicarlo se qualcuno che cercava come me poteva usarlo. Quello che ho fatto è stato inserire Listview a colonna singola sul mio modulo con View set to Detail mode, MultiSelect impostato su True e Checkboxes su True. Il seguente codice consentirà l'elenco a discesa. Dato che ho una selezione multipla, non è necessario visualizzare il valore selezionato come faresti in una casella combinata in modo che il menu a discesa appaia come un pulsante per mostrare/nascondere l'elenco. Nel codice seguente sto dividendo l'altezza di 4 perché la mia lista è statica e questo è il numero di caselle di controllo che ho nella mia lista. Se hai una lista dinamica, leggi il numero di elementi da Listview e usalo. Potrebbe essere necessario giocarci un po 'per ottenere l'aspetto che desideri.Ecco gli appuntamenti che uso:

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 

L'evento ColumnClick gestisce quando fanno clic su quello che appare come il pulsante Mostra/Nascondi elenco e l'evento ItemChecked mi permette di gestire tutto ciò che ha bisogno di rispondere a un cambiamento nelle caselle di controllo . Il valore di ciascuno viene letto accedendo al valore "lvList.Items (iRowNum) .Checked" dove iRowNum è la riga che si desidera controllare. Spero che questo aiuti la prossima persona che ha bisogno di qualcosa di simile.

hground

0

Props per hground per l'utilizzo di un controllo ListView per questo scopo. Proverò a dare una versione migliorata del suo concetto.

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 

Si potrebbe voler modificare i valori letterali sopra in base alla dimensione del carattere o qualcosa del genere.

Problemi correlati