2009-09-29 36 views
5

¿Cómo puedo hacer una lista desplegable con casillas de verificación? Tengo una aplicación de Windows (vb.net) y el control de lista de casilla de verificación no es una opción real con el espacio disponible en mi formulario.Lista desplegable con casillas de verificación

Gracias.

Respuesta

1

La forma más fácil de crear este efecto es usar tres controles: una edición, un botón (a la derecha de la edición, con un icono desplegable) y una casilla de verificación como la que está usando ahora.

Coloque la casilla de verificación debajo de la edición para que su ancho sea el mismo que la edición y el botón al lado de la edición, y lo haga invisible. Ahora, agregue código al botón para:

  1. Hacer el CheckListBox visible si no es visible y para hacerlo no es visible si está visible (es decir, la vuelta al valor de .Visible).

  2. Código de llamada para crear una versión "resumida" de lo que se verificó y no revisarla ni mostrarla en la edición. Por ejemplo, si su "lista desplegable" contiene nombres de colores, puede hacer que su código cree una lista delimitada por comas de los colores marcados y mostrarlos en la edición.

Puede llevar esto un poco más y poner el CheckBoxList en un contenedor de panel y añadir pequeños botones a la "desplegable" para ejecutar cualquier función especial que podría ser apropiado en su aplicación (marque todo, desactive todos, sea cual sea)

+0

Usando este tipo de enfoque (nota: no necesariamente recomendado), me quedaría con la lista desplegable, pero cuando se abra la parte desplegable, superponga una lista de casilla de verificación. –

+0

que es una muy buena idea, muchas gracias – Iulian

4

Tendría que ir al propietario para obtener ese tipo de funcionalidad.

Si su formulario no tiene espacio, le sugiero que primero intente ver si puede refactorizar la GUI para hacerlo más simple.

+1

+1 para la refacturación de la interfaz gráfica de usuario. –

1

Sospecho que su pregunta puede ser editada, ya que no está muy clara en este momento. Supongo que quiere un control de lista desplegable en el formulario, pero cuando la lista se despliega, ¿tiene casillas de verificación como opciones dentro de ella? Si es así, sospecho que puede estar buscando un conjunto de controles personalizados (los controles Telerik le permitirán modelar un RadComboBox por ejemplo), pero no creo que haya ningún control estándar que lo permita.

+0

Sí, me gustaría hacer una lista desplegable poblada con cuadros combinados, como el cuadro de diálogo de filtro en excel 2007. Comprar es algo inútil, el objetivo de mi aplicación es practicar y aprender a hacer algunas cosas en vb.net – Iulian

+0

Tiendo a trabajar en el mundo de asp.net, pero se encontraron los siguientes con una búsqueda en Google: tal vez algunos de ellos tengan código que pueda ayudarlo a aprender, en particular, que el primer hilo en SO se ve bien: 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

¿Cómo plantilla un RadComboBox? –

0

He encontrado un artículo de CodeProject sobre cómo hacerlo (más como "ya hecho", pero al menos puedo hojear el código y saber cómo lo hizo) No sé cómo me he perdido eso más temprano.

Aquí está el link.

2

Encontré una solución más simple y pensé que la publicaría si alguien que buscaba como yo pudiera usarla. Lo que hice fue insertar una vista de lista de una sola columna en mi formulario con Vista configurada en modo Detalles, MultiSeleccionar establecido en Verdadero y Casillas de verificación configuradas en Verdadero. El siguiente código permitirá que la lista se despliegue. Como tengo una selección múltiple, no es necesario mostrar el valor seleccionado como lo haría en un cuadro combinado, por lo que el menú desplegable parece ser un botón para Mostrar/Ocultar la lista. En el siguiente código, estoy dividiendo la altura entre 4 porque mi lista es estática y esa es la cantidad de casillas de verificación que tengo en mi lista. Si tiene una lista dinámica, simplemente lea la cantidad de elementos de Listview y úselos. Puede que tenga que jugar con él para obtener la apariencia que desea.Aquí están los eventos que utilizo:

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 

El evento ColumnClick maneja al hacer clic en lo que parece el botón Mostrar/Ocultar la lista y el evento ItemChecked deja que me encargue de todo lo que tiene que responder a un cambio en las casillas de verificación . El valor de cada uno se lee accediendo al valor "lvList.Items (iRowNum). Chequeado" donde iRowNum es la fila que desea verificar. Espero que esto ayude a la siguiente persona que necesita algo como esto.

hground

0

Apoyos a hground para el uso de un ListView para este propósito. Trataré de dar una versión mejorada de su concepto.

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 

Es posible que desee ajustar los valores literales anteriores en función del tamaño de la fuente o algo así.

Cuestiones relacionadas