2009-06-01 43 views
20

Necesito seleccionar todos los elementos en un ListBox cuando se hace clic en un CheckBox. ¿Es posible seleccionar todos los elementos en el ListBox usando una sola línea de código? ¿O tendré que recorrer todos los elementos y establecer seleccionado en verdadero para cada uno de ellos?ListBox seleccione todos los elementos

Gracias :)

Respuesta

5

Creo que tiene que hacer clic aquí. Seleccionar todos los elementos a la vez es un caso de uso bastante específico (y probablemente raro) en el que simplemente no tiene sentido ofrecer esa funcionalidad de la caja. Además, el bucle será solo dos líneas de código de todos modos.

55

El hecho es que ListBox.Items es una colección de objetos simples y devuelve objetos sin tipo, que no se pueden seleccionar de forma múltiple (por defecto).

Si desea realizar varias seleccionar todos los elementos, entonces esto va a trabajar:

for (int i = 0; i < myListBox.Items.Count;i++) 
    { 
     myListBox.SetSelected(i, true); 
    } 
+2

Esta debe ser la respuesta aceptada. –

7

he visto una serie de (similar) responde a todo lo que hace, lógicamente, la misma cosa, y yo estaba desconcertado por qué todavía todos no trabajan para mí. La clave es configurar listbox's SelectionMode a SelectionMode.MultiSimple. No funciona con SelectionMode.MultiExtended. Teniendo en cuenta que para seleccionar varios elementos en un cuadro de lista, tendrá el modo de selección configurado en modo múltiple, y la mayoría de la gente optará por el estilo convencional MultiExtended, esta respuesta debería ayudar mucho. Y ya no es un foreach, sino for.

En realidad debería hacer esto:

lb.SelectionMode = SelectionMode.MultiSimple; 
for (int i = 0; i < lb.Items.Count; i++) 
    lb.SetSelected(i, true); 
lb.SelectionMode = //back to what you want 

O

lb.SelectionMode = SelectionMode.MultiSimple; 
for (int i = 0; i < lb.Items.Count; i++) 
    lb.SelectedIndices.Add(i); 
lb.SelectionMode = //back to what you want 
+1

Si agrega 'e.SuppressKeyPress = true;' debería funcionar, independientemente del SelectionMode. –

1

utilizo solución de Mika, sin embargo, esto puede ser muy lento si tiene miles de artículos. Para un aumento de velocidad masivo puede apagar la visibilidad brevemente. El cuadro de lista no desaparecerá realmente durante la operación, ya que podría sospechar, pero la selección se produce al menos 10 veces más rápido en mi caso.

myListBox.Visible = false; 
for (int i = 0; i < myListBox.Items.Count;i++) 
{ 
    myListBox.SetSelected(i, true); 
} 
myListBox.Visible = true; 
+6

Creo que el 'myListBox.Visible = false' es más rápido porque evita el dibujo durante la actualización. Utilizaría los métodos proporcionados 'myListBox.BeginUpdate()' y 'myListBox.EndUpdate()' :) – DiogoNeves

+1

+1 para el comentario de DiogoNeves. Es mejor, porque también hace que el foco permanezca en el cuadro de lista. Para la solución de Robin uno tiene que llamar a myListBox.Focus() después de configurarlo de nuevo visible. – huha

7

Por lo que yo puedo decir, utilizando cualquiera de los métodos de .NET para seleccionar un gran número de elementos es mucho más lento que hacer una llamada directa PInvoke, pasando el mensaje LB_SETSEL (0x185) para el control, la una bandera que indica si desea Seleccionar (1) o Deseleccionar (0), así como el valor mágico (-1) que indica que el cambio debe aplicarse a todos los artículos.

[DllImport("user32.dll", EntryPoint = "SendMessage")] 
    internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam); 

    // Select All 
    SendMessage(listBox.Handle, 0x185, (IntPtr)1, (IntPtr)(-1)); 

    // Unselect All 
    SendMessage(listBox.Handle, 0x185, (IntPtr)0, (IntPtr)(-1)); 
+0

Buen intento. Realmente selecciona todos los elementos, pero la enumeración de elementos falla. El problema es que después de SendMessage para seleccionar todos los elementos que recibo, SelectedItems.Count muestra el recuento de todos los elementos de la lista (esto es correcto). Pero cuando intento enumerar SelectedItems, solo se realiza una iteración. Cuando realizo 'SelectedItems [SelectedItems.Count - 1]' se lanza la excepción IndexOutOfRange. Parece que los elementos están seleccionados, pero el cuadro de lista no actualiza las listas internas con ellos. Para calcular la propiedad 'SelectedObjectCollection.Count' getter envía otro mensaje de ventana que devuelve el recuento de todos los elementos. – oleksa

+0

El -1 no es tan mágico, consulte el [mensaje LB_SETSEL (Windows)] (http://msdn.microsoft.com/de-de/library/windows/desktop/bb761352%28v=vs.85%29.aspx) . Por cierto: Funciona bien con la clase VCL TListBox. – Wolf

+0

Hola, @Lobo. El término "magia" tiene un significado particular en la programación; ver http://en.wikipedia.org/wiki/Magic_number_(programming) – EricLaw

-4
private void Button_Click(object sender, RoutedEventArgs e) 
    { 

      listbox.SelectAll(); 

    } 
+0

qué versión de .Net es esto? –

+0

No hay ningún método SelectAll en el ListBox de WinForms. Probablemente esté pensando en el ListBox de WPF, pero esta pregunta está etiquetada como "winforms" y ".net-2.0". –

0

esto no es absolutamente agradable, pero mucho más rápido que un bucle si tiene muchos muchos artículos (100 +): Seleccione el cuadro de lista y simular la entrada de clave [Inicio] y [SHIFT] + [ final]

lb.BeginUpdate(); 
lb.Select(); 
SendKeys.Send("{Home}"); 
SendKeys.Send("+{End}"); 
lb.EndUpdate(); 

EDIT: sólo se trabaja con SelectionMode.MultiExtended supongo

DoubleEDit: también ser conscientes de que esto podría ser demasiado lento para el código que se realiza con lb.selecteditems afterwar ds, pero puede ser útil para un botón [Seleccionar todo] en el que el usuario hará clic.

+0

No funciona para mí (usando .Net 4.7). El cuadro de lista simplemente parpadea y eso es todo. –

1

Dentro de este Constructor, debe activar el modo de selección múltiple (MultiExtended) del cuadro de texto deseado.

public Form1() 
{ 
    InitializeComponent(); 
    listBox1.SelectionMode = SelectionMode.MultiExtended; 
    listBox2.SelectionMode = SelectionMode.MultiExtended; 
} 

Después de esto, utilizar un bucle para seleccionar todo:

private void selectAll_Click(object sender, EventArgs e) 
{ 
    for (int val = 0; val < listBox1.Items.Count; val++) 
    { 
     listBox1.SetSelected(val, true); 
    } 
} 

he comprobado. Funciona. También puede usar el botón [CTRL/SHIFT] + clic izquierdo para seleccionar los elementos individualmente.

-1

Seleccionar todo es definitivamente disponible fuera de la caja:

$("#ListBoxID option").prop("selected", true); 
+1

La pregunta es para winforms no web –

+0

Este código tampoco está fuera de la caja. El código enumerado es jQuery y no C#/VB.NET – fujiiface

1

Sé que esta pregunta se etiqueta con .NET 2.0, pero si usted tiene LINQ a su disposición en 3.5 +, puede hacer lo siguiente :

ASP.NET Web Forms

var selected = listBox.Items.Cast<System.Web.UI.WebControls.ListItem>().All(i => i.Selected = true); 

WinForms

var selected = listBox.SelectedItems.Cast<int>().ToArray(); 
+0

No, recibo No se pudo encontrar el tipo o nombre ListItem. (¿Te falta una directiva de uso o referencia de ensamblaje). –

+0

Parece un poco excesivo rechazar la solución en lugar de trabajar con la persona para descubrir por qué la solución podría no funcionar para usted. ¿Tiene la mencionada Directiva de uso 'using System.Web.UI.WebControls;'? ¿Estás haciendo referencia al ensamblaje? Respuesta actualizada para hacer referencia al ensamblaje. – fujiiface

+0

Lo siento, fujiface. Te volví a votar. Inicialmente pensé que escribiste tu publicación en 2014, así que no esperaba una respuesta. Parece que no puedo acceder a System.Web.UI.WebControls. Todo lo que puedo ver es System.Web. Intenté agregar una referencia pero tampoco aparece allí. Tal vez fue desaprobado en 4.7? Busqué un paquete NuGet con ese nombre y tampoco está allí. –

Cuestiones relacionadas