Fijate en una cosa...
Cita: Me.lst_distr_seleccionados.Items.Remove(Me.lst_dis tr_seleccionados.SelectedItem)
vs
Cita: Me.lst_distr_seleccionados.Items.RemoveAt(n)
Tu haces un remove al item seleccionado.... yo hago un removeat (posicion) tomado del indice seleccionado por lo que no tomaria el valor de cero si no el valor del indice... es exactamente lo que quieres.
Ahora bien, si lo que quieres es hacerlo en modo de seleccion multiple, primero debes obtener la coleccion de indices seleccionados.
Cita: Dim n() As Integer = Me.ListBox1.GetSelectedIndices
Dim l As Integer = n.GetUpperBound(0)
For i = l To 0
Me.ListBox1.Items.RemoveAt(n(i))
Next
Declaramos un array contenedor de indices y lo igualamos al metodo que obtiene dichos indices.
Declaramos una variable numerica y la igualamos al indice maximo del array.
Mediante un bucle inverso eliminamos el item del listbox alojado en el indice obtenido de nuestro array de indices.
Ahora preguntaras.... ¿Porque un inverso y no uno normal o un for each? Bien, si tu tienes seleccionado por ejemplo el indice 3 y el 5.... al eliminar el 3 el 5 dejaria de ser 5 y ahora seria 4, por lo que o te da un fallo de fuera de limites al no existir ya el 5 o te elimina el que no es. Al hacerlo inverso, si eliminamos el 5 primero el 3 sigue siendo el 3.
Si te hubieses fijado bien en el codigo que te puse antes o lo hubieses probado, te habrias dado cuenta de la sutil pero necesaria modificacion dentro de el.
Prueba este y me cuentas. Un saludo!
P.D. No sera esto parte de una web verdad?