none
Sugerencias para llistview's con checkbox activados. RRS feed

  • Pregunta

  • Hola amigos del foro, agradezco de antemano sus sugerencias para el codigo presentado a continuación, el problema que traigo es el siguiente: Estoy intentado pasar un conjunto de personas seleccionadas con un check de una lista a otra, logicamente esas personas que ya fueron seleccionadas no pueden repetirse en la segunda lista de los escogidos y justo eso es lo que no logro conseguir, continuamente se me repiten los que ya fueron seleccionados y ya se me agotaron las ideas para que funcionara este fragmento de codigo. Lo que quiero es que los seleccione en las primera lista y automaticamente se envien a la 2 lista y si ya existe en la segunda lista que no se repitan.

    Dim a As Integer = 0
    
        Private Sub Lista1_ItemChecked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles Lista1.ItemChecked
            Dim comparar As Integer
    
            For i As Integer = 0 To Lista1.CheckedItems.Count - 1 Step 1
                    Lista2.Items().Add(Lista1.CheckedItems(i).Text)
                    Lista2.Items(a).SubItems().Add(Lista1.CheckedItems(i).SubItems(1).Text)
                    Lista2.Items(a).SubItems().Add(Lista1.CheckedItems(i).SubItems(4).Text)
                    Lista1.CheckedItems(i).Checked = False
                    a = a + 1
            Next
        End Sub

    lunes, 17 de septiembre de 2018 13:58

Respuestas

  • Hola:

    Cuando añadas un elemento en la Lista2, hazlo con clave y luego compruebas que exista antes de volver a añadir:

        Private Sub Lista1_ItemChecked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles Lista1.ItemChecked
            For i As Integer = 0 To Lista1.CheckedItems.Count - 1 Step 1
                ' SUPONEMOS que Lista1.CheckedItems(i).Text, aparte de ser el Texto a mostrar, también es un texto UNICO, así que lo usamos de Clave
                If Not Lista2.Items.ContainsKey(Lista1.CheckedItems(i).Text) Then
                    With Lista2.Items.Add(Lista1.CheckedItems(i).Text, Lista1.CheckedItems(i).Text, 0)
                        .SubItems().Add(Lista1.CheckedItems(i).SubItems(1).Text)
                        .SubItems().Add(Lista1.CheckedItems(i).SubItems(4).Text)
                    End With
                End If
                Lista1.CheckedItems(i).Checked = False
            Next
        End Sub

    Si tienes algun SubItem() que sea único (DNI, o similar), usa ese Subitem como clave mejor que el nombre.

    Además, si usas CLAVE para añadir en Lista2, entonces no haría falta recorrer TODOS los checkedItems cada vez que cambias uno, podrías acceder directamente al que quieres para añadir/quitar, quedaría algo así:

        Private Sub Lista1_ItemChecked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles Lista1.ItemChecked
            If e.Item.Checked Then
                ' Si seleccionamos un elemento, lo añadimos SI NO EXISTE
                If Not Lista2.Items.ContainsKey(e.Item.Text) Then
                    With Lista2.Items.Add(e.Item.Text, e.Item.Text, 0)
                        .SubItems().Add(e.Item.SubItems(1).Text)
                        .SubItems().Add(e.Item.SubItems(4).Text)
                    End With
                End If
            Else
                ' Si deseleccionamos un elemento, lo quitamos de LISTA2
                If Lista2.Items.ContainsKey(e.Item.Text) Then
                    Lista2.Items.RemoveByKey(e.Item.Text)
                End If
            End If
        End Sub

    Espero que te sirva.

    Un saludo


    • Editado LG DES lunes, 17 de septiembre de 2018 15:39
    • Propuesto como respuesta LG DES jueves, 20 de septiembre de 2018 7:24
    • Marcado como respuesta Pablo Rubio lunes, 24 de septiembre de 2018 14:51
    lunes, 17 de septiembre de 2018 15:37

Todas las respuestas

  • Hola:

    Cuando añadas un elemento en la Lista2, hazlo con clave y luego compruebas que exista antes de volver a añadir:

        Private Sub Lista1_ItemChecked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles Lista1.ItemChecked
            For i As Integer = 0 To Lista1.CheckedItems.Count - 1 Step 1
                ' SUPONEMOS que Lista1.CheckedItems(i).Text, aparte de ser el Texto a mostrar, también es un texto UNICO, así que lo usamos de Clave
                If Not Lista2.Items.ContainsKey(Lista1.CheckedItems(i).Text) Then
                    With Lista2.Items.Add(Lista1.CheckedItems(i).Text, Lista1.CheckedItems(i).Text, 0)
                        .SubItems().Add(Lista1.CheckedItems(i).SubItems(1).Text)
                        .SubItems().Add(Lista1.CheckedItems(i).SubItems(4).Text)
                    End With
                End If
                Lista1.CheckedItems(i).Checked = False
            Next
        End Sub

    Si tienes algun SubItem() que sea único (DNI, o similar), usa ese Subitem como clave mejor que el nombre.

    Además, si usas CLAVE para añadir en Lista2, entonces no haría falta recorrer TODOS los checkedItems cada vez que cambias uno, podrías acceder directamente al que quieres para añadir/quitar, quedaría algo así:

        Private Sub Lista1_ItemChecked(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ItemCheckedEventArgs) Handles Lista1.ItemChecked
            If e.Item.Checked Then
                ' Si seleccionamos un elemento, lo añadimos SI NO EXISTE
                If Not Lista2.Items.ContainsKey(e.Item.Text) Then
                    With Lista2.Items.Add(e.Item.Text, e.Item.Text, 0)
                        .SubItems().Add(e.Item.SubItems(1).Text)
                        .SubItems().Add(e.Item.SubItems(4).Text)
                    End With
                End If
            Else
                ' Si deseleccionamos un elemento, lo quitamos de LISTA2
                If Lista2.Items.ContainsKey(e.Item.Text) Then
                    Lista2.Items.RemoveByKey(e.Item.Text)
                End If
            End If
        End Sub

    Espero que te sirva.

    Un saludo


    • Editado LG DES lunes, 17 de septiembre de 2018 15:39
    • Propuesto como respuesta LG DES jueves, 20 de septiembre de 2018 7:24
    • Marcado como respuesta Pablo Rubio lunes, 24 de septiembre de 2018 14:51
    lunes, 17 de septiembre de 2018 15:37
  • Gracias LG DES! eso tiene mucho sentido, lo probare y luego te comento si me funciono.
    lunes, 24 de septiembre de 2018 15:20