¿Eliminar elementos de un listbox en VB?

Resuelto
nico8002 Mensajes publicados 85 Estado Miembro -  
 sky -
Hola a todos,

tengo un Select que me muestra los resultados en una lista y me gustaría poder retirar elementos de esta lista.

Quisiera hacer clic en un nombre de mi lista y hacer clic en un botón "retirar"

¿Tienen algunas ideas de código?

Gracias de antemano.

Configuración: Windows XP / Internet Explorer 6.0

13 respuestas

  1. nico8002 Mensajes publicados 85 Estado Miembro 1
     
    ah, pero en realidad no quiero eliminarlo de mi base, solo quiero quitarlo de mi lista.
    ¿tendrías alguna idea de cómo hacerlo?
    porque estoy empezando con vb, estoy un poco perdido :s
    1
  2. AnthonyG
     
    En tu botón de quitar, puedes realizar una eliminación del registro en tu base de datos con una consulta SQL del tipo:
    "DELETE * FROM TuTabla WHERE TuTabla.Nombre = ""& Me.ListBox.Text &"";"
    0
    1. sky
       
      muy tonto
      0
  3. chrij Mensajes publicados 124 Estado Miembro 49
     
    Hola,
    tienes que recuperar el índice de los elementos a eliminar (índice i por ejemplo).

    Luego, puedes hacer :
    ListBox1.Items.RemoveAt(i)
    0
    1. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      Hice esto

      Dim ItemObject(9) As System.Object
      Dim i As Integer
      For i = 0 To 9
      ItemObject(i) = "Item" & i
      Next i
      LB_ListeMachines.Items.RemoveAt(i)

      pero cuando ejecuto mi aplicación y hago clic en el botón, me subraya en amarillo la línea que he resaltado.
      0
  4. AnthonyG
     
    No soy muy imaginativo esta mañana, pero podrías crear una segunda tabla similar a la primera en la que harías una copia de tu tabla fuente. Para retirarle elementos, los eliminarías como te lo propuse más arriba.
    Es una solución muy sucia, lo reconozco y seguramente podrás encontrar algo mejor.
    También puedes considerar almacenar aquellos que deseas conservar en otra tabla, en lugar de eliminar lo que ya no quieres, pero eso no es mucho mejor.
    ¿Qué uso piensas darle a tu lista depurada, en realidad?
    0
  5. nico8002 Mensajes publicados 85 Estado Miembro 1
     
    Lo que pasa es que tengo una base de datos con una lista de máquinas
    y voy a tener que enviar un archivo a ciertas máquinas
    por lo que muestro las máquinas (presentes en mi base) en un listbox
    y me gustaría retirar en el listbox las que no quiero enviar mi archivo, solo a las que deseo enviar.
    0
  6. nico8002 Mensajes publicados 85 Estado Miembro 1
     
    Chrij, hice esto

    Dim ItemObject(9) As System.Object
    Dim i As Integer
    For i = 0 To 9
    ItemObject(i) = "Item" & i
    Next i
    LB_ListeMachines.Items.RemoveAt(i)

    pero cuando ejecuto mi aplicación y hago clic en el botón, me resalta en amarillo la línea que he subrayado.
    0
    1. chrij Mensajes publicados 124 Estado Miembro 49
       
      ¿Qué error te da?

      Con lo que acabas de escribir, vas a quitar el objeto cuyo índice es 9 de tu lista (el último i = 9).

      Según lo que has escrito al principio, quieres eliminar lo que seleccionas en la lista. Si es eso, puedes hacer:
      For Each item In ListBox1.SelectedItems ListBox1.Items.Remove(item) Next
      0
    2. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      He puesto lo que me diste:

      For Each item In LB_ListeMachines.SelectedItems
      LB_ListeMachines.Items.Remove(item)
      Next

      y me resalta en amarillo siempre la línea que tú subrayaste y me dice esto:

      Imposible modificar la colección de elementos cuando la propiedad DataSource está definida.
      0
    3. chrij Mensajes publicados 124 Estado Miembro 49
       
      intenta cerrar tu DataSource antes de la eliminación:

      ObjetDataSet.Clear()
      0
    4. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      Dim ObjetDataSet As DataSet
      ObjetDataSet.Clear()
      For Each item In LB_ListeMachines.SelectedItems
      LB_ListeMachines.Items.Remove(item)
      Next

      He hecho esto, pero se subraya en verde lo que he subrayado y me dice:
      "La variable 'ObjetDataSet' se utiliza antes de que se le haya asignado un valor. Se puede producir una excepción de referencia nula en tiempo de ejecución."
      0
    5. chrij Mensajes publicados 124 Estado Miembro 49
       
      Normal para el error.
      No debes crear el objeto dataset.
      Debes tener en algún lugar un "Data algo" que está abierto (eso es lo que decía el error "No se puede modificar la colección de elementos cuando se establece la propiedad DataSource" Debes cerrarlo para modificar los elementos del Listbox.
      0
  7. nico8002 Mensajes publicados 85 Estado Miembro 1
     
    de hecho no funciona,

    Dim DT As New DataTable
    DT.Clear()
    For Each item In LB_ListeMachines.SelectedItems
    LB_ListeMachines.Items.Remove(item)
    Next

    veo que hice lo que me dijiste para mi datasource pero sigue subrayando lo mismo y me dice el mismo error
    0
  8. chrij Mensajes publicados 124 Estado Miembro 49
     
    Acabo de hacer una prueba rápida que parece funcionar:
    Dim lista Como ListBox.SelectedIndexCollection lista = ListBox1.SelectedIndices Para Cada item En lista ListBox1.Items.RemoveAt(item) Siguiente


    Normalmente solo borra los elementos seleccionados.
    0
    1. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      bha me quita siempre toda mi lista.
      0
    2. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      Dim liste As ListBox.SelectedIndexCollection
      liste = LB_ListeMachines.SelectedIndices
      For Each item In liste
      LB_ListeMachines.Items.RemoveAt(item)
      Next

      he puesto esto ..
      0
    3. chrij Mensajes publicados 124 Estado Miembro 49
       
      ¿Lo has puesto en una función?
      ¿No tienes nada más que seleccione los elementos de tu lista?

      Cuando hice mi prueba, seleccionaba los elementos con el ratón y luego eliminaba el ítem seleccionado.

      ¿Tienes bien 1 solo elemento seleccionado cada vez?
      0
    4. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      Tengo un botón "mostrar" para poner en el cuadro de lista todos los nombres que están en mi base
      después, en mi base cada máquina posee un sector, hay 2 en mi caso
      así que tengo una casilla de verificación que me muestra las máquinas de uno de los 2 sectores y otra que hace lo contrario.
      así que no hay nada que seleccione mis elementos.
      0
    5. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      ¿Tengo que poner código en la función de mi listbox?
      0
  9. lermite222 Mensajes publicados 9042 Estado Colaborador 1 199
     
    Bonjour,
    Aparentemente estás en VB.Net, no conozco la sintaxis pero en VB6 escribiría...
     For i = ListBox1.Count - 1 To 0 Step -1 If ListBox1.Selected(i) Then ListBox1.RemoveItem (i) i = i - 1 End If Next i

    A ti de transcribir en .net
    A=

    --
    La experiencia instruye más seguramente que el consejo. (André Gide)
    Si te golpeas contra una maceta y suena hueco, no necesariamente es la maceta la que está vacía. ;-)(Confucio)
    0
    1. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      ok
      voy a intentar transcribir todo eso
      gracias
      0
    2. lermite222 Mensajes publicados 9042 Estado Colaborador 1 199
       
      Al leer tu mensaje principal, podrías eliminar directamente la línea en el evento clic de la listBox
       ListBox1.RemoveItem (ListBox1.ListIndex)
      0
  10. chrij Mensajes publicados 124 Estado Miembro 49
     
    Bueno, lo que está bien es que trabajamos con la misma versión de vb.
    Lo que está menos bien es que yo no tengo problemas.

    ¿Puedes mostrarme la función que llena tu listbox?
    0
    1. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      Sub privado B_Afficher_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Afficher.Click

      Dim DT As New DataTable
      DT.Clear()
      Dim oleDbConnex As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=C:\...\BDD.mdb")
      Dim oleCmd As New OleDb.OleDbCommand("SELECT NomMachine FROM Machine", oleDbConnex)

      Try
      Dim TA As New OleDb.OleDbDataAdapter(oleCmd)
      TA.Fill(DT)
      With LB_ListeMachines
      .ValueMember = "NomMachine"
      .DisplayMember = "NomMachine"
      .DataSource = DT
      End With
      Catch ex As Exception
      MessageBox.Show("¡Imposible establecer la conexión con la base de datos! " & ex.Message)
      End Try

      For i = 0 To LB_ListeMachines.Items.Count - 1
      LB_ListeMachines.SetSelected(i, False)
      Next

      End Sub
      0
    2. lermite222 Mensajes publicados 9042 Estado Colaborador 1 199
       
      Dado que está bien... no veo qué tiene que ver la forma de llenar la listbox con la pregunta ??
      Y dado que no tienes ningún problema, intenta traducir la función que muestro más arriba en .net. :D
      0
    3. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      pero lo hice y también me elimina toda mi lista :/

      así es como lo traduje:

      For i = LB_ListeMachines.Items.Count - 1 To 0 Step -1
      If LB_ListeMachines.SelectedItems(i) Then
      LB_ListeMachines.Items.RemoveAt(i)
      i = i - 1
      End If
      Next i
      0
    4. chrij Mensajes publicados 124 Estado Miembro 49
       
      Aquí está la función de Lermite 222 en vb2008 :
      For i = ListBox1.Items.Count - 1 To 0 Step -1 If ListBox1.GetSelected(i) Then ListBox1.Items.RemoveAt(i) i = i - 1 End If Next i 
      0
    5. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      los puse, siempre lo elimina todo :'(
      0
  11. chrij Mensajes publicados 124 Estado Miembro 49
     
    He encontrado un enlace que propone una solución para llenar una listbox a partir de una base de datos.
    https://codes-sources.commentcamarche.net/

    En resumen, necesitarías poner:
     TA.Fill(DT) oleDbConnex.Close() for i=0 to DT.Rows.Count -1 LB_ListeMachines.Items.Add(DT.Rows(i)("NomColonne").toString) Next 


    No tengo una base de datos a mano para probar...
    0
    1. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      bueno, he llenado mi listbox
      está bien, se muestra todo cuando hago clic
      0
    2. chrij Mensajes publicados 124 Estado Miembro 49
       
      sí, pero si te indica
      ListBox1.Items.Count = 0 eso significa que hay un problema.

      No entiendo por qué..
      0
    3. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      sí, admito que es extraño
      quizás sea por el DT.clear? dado que está colocado en la función del botón retirar y justo antes de la eliminación?
      0
    4. chrij Mensajes publicados 124 Estado Miembro 49
       
      intenta quitarlo y ver si tienes una lista con un conteo un poco más grande ;-)
      0
    5. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      Uai, pero si lo quito, me vuelve a dar el error anterior, me subraya la línea en amarillo y me dice: "Imposible modificar la colección de elementos cuando la propiedad DataSource está definida."
      0
  12. chrij Mensajes publicados 124 Estado Miembro 49
     
    Hola,
    he estado mirando un poco desde ayer.
    El problema es que ligas tu fuente de datos a tu lista: por lo tanto, no puedes modificar tu lista directamente (riesgo de modificar la base de datos) y tampoco puedes cerrar tu conexión (eso vacía la lista).

    Hay que encontrar una forma de llenar de otra manera tu listbox para que use los datos sin estar ligado a la base.
    La solución que había mencionado más arriba puede ser una forma de lograrlo.
    0
    1. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      ah sí, veo lo que quieres decir
      ¿hablas de qué solución?
      0
    2. chrij Mensajes publicados 124 Estado Miembro 49
       
      TA.Fill(DT) oleDbConnex.Close() for i=0 to DT.Rows.Count -1 LB_ListeMachines.Items.Add(DT.Rows(i)("NomColonne").toString) Next 

      Lógicamente (pero, ¿es la informática una cuestión de lógica?? ;-)), esto recupera los datos y los añade a los elementos de la listbox (sin enlazarlos)
      Dime tú si eso cambia algo.
      0
    3. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      ¿Este código lo debería poner en mi botón de llenado, verdad?
      0
    4. chrij Mensajes publicados 124 Estado Miembro 49
       
      oui
      0
    5. nico8002 Mensajes publicados 85 Estado Miembro 1
       
      ok ok
      bueno, voy a intentar eso ;)
      0
  13. nico8002 Mensajes publicados 85 Estado Miembro 1
     
    Aquí está el código para el siguiente que estará en la misma situación que yo, lol.

    El código de la función para llenar la listbox

    Private Sub CKB_ChoixTodasMachines_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
    DT.Clear()
    Dim oleDbConnex As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=C:\..\BDD.mdb")
    Dim oleCmd As New OleDb.OleDbCommand("SELECT NomMachine FROM Machine ORDER BY NomMachine", oleDbConnex)
    Try
    Dim TA As New OleDb.OleDbDataAdapter(oleCmd)
    LB_ListeMachines.Items.Clear()
    TA.Fill(DT)
    oleDbConnex.Close()
    For i = 0 To DT.Rows.Count - 1
    LB_ListeMachines.Items.Add(DT.Rows(i)("NomMachine").ToString)
    Next
    Catch ex As Exception
    MessageBox.Show("¡Imposible establecer la conexión con la base de datos! !! " & ex.Message)
    End Try
    For i = 0 To LB_ListeMachines.Items.Count - 1
    LB_ListeMachines.SetSelected(i, False)
    Next
    End Sub

    El código de la función para quitar un elemento de la listbox

    Private Sub B_Retirar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles B_Retirar.Click
    DT.Clear()
    For i = LB_ListeMachines.Items.Count - 1 To 0 Step -1
    If LB_ListeMachines.GetSelected(i) Then
    LB_ListeMachines.Items.RemoveAt(i)
    i = i - 1
    End If
    Next i
    End Sub
    0