¿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

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
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
sky
 
muy tonto
0
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
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
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
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
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
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
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
chrij Mensajes publicados 124 Estado Miembro 49
 
intenta cerrar tu DataSource antes de la eliminación:

ObjetDataSet.Clear()
0
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
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
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
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
nico8002 Mensajes publicados 85 Estado Miembro 1
 
bha me quita siempre toda mi lista.
0
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
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
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
nico8002 Mensajes publicados 85 Estado Miembro 1
 
¿Tengo que poner código en la función de mi listbox?
0
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
nico8002 Mensajes publicados 85 Estado Miembro 1
 
ok
voy a intentar transcribir todo eso
gracias
0
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
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
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
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
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
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
nico8002 Mensajes publicados 85 Estado Miembro 1
 
los puse, siempre lo elimina todo :'(
0
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
nico8002 Mensajes publicados 85 Estado Miembro 1
 
bueno, he llenado mi listbox
está bien, se muestra todo cuando hago clic
0
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
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
chrij Mensajes publicados 124 Estado Miembro 49
 
intenta quitarlo y ver si tienes una lista con un conteo un poco más grande ;-)
0
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
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
nico8002 Mensajes publicados 85 Estado Miembro 1
 
ah sí, veo lo que quieres decir
¿hablas de qué solución?
0
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
nico8002 Mensajes publicados 85 Estado Miembro 1
 
¿Este código lo debería poner en mi botón de llenado, verdad?
0
chrij Mensajes publicados 124 Estado Miembro 49
 
oui
0
nico8002 Mensajes publicados 85 Estado Miembro 1
 
ok ok
bueno, voy a intentar eso ;)
0
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