Visual Basic.NET - Problemas al borrar controles

 
Vista:

Problemas al borrar controles

Publicado por Santi (4 intervenciones) el 02/11/2005 10:33:37
Hola de nuevo.

Tengo un problemilla al borrar controles que creo de forma dinámica. No sé por qué no me los borra todos. Os paso un ejemplo muy muy sencillo. Hay que añadir dos botones (button1, button2) y un label (label1) a un formulario.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
CrearControles()
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
BorrarControles()
End Sub

Private Sub CrearControles()
Dim contador As Integer
Dim o As Label
Dim x As Integer
Dim y As Integer

For x = 1 To 15
For y = 1 To 15
o = New Label
o.Size = New Size(20, 20)
o.Location = New Point(x * 21, y * 21)
o.BackColor = Color.DarkGray
o.Name = "borrar"

contador += 1
Me.Controls.Add(o)
Next
Next

Label1.Text = contador.ToString & " objetos creados"
End Sub

Private Sub BorrarControles()
Dim contador As Integer

For Each o As Control In Me.Controls
If Not IsNothing(o) Then
If o.Name = "borrar" Then
Me.Controls.Remove(o)
o.Dispose()
o = Nothing

contador += 1
End If
End If
Next

Label1.Text = contador.ToString & " objetos borrados"
End Sub

El programilla funciona así: al pulsar button1 se crean 225 labels, pero al pulsar button2 ¡sólo se borran la mitad! Si vuelvo a pulsar button2 ¡se vuelven a borrar la mitad de los que habían quedado! ¿Qué está pasando? ¿Por qué no se borran todos a la vez? ¿Qué hago mal?

¡Muchas gracias de nuevo a todos los que colaboráis en este foro!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problemas al borrar controles

Publicado por Edgar (1501 intervenciones) el 03/11/2005 15:26:03
Hola

Creo que el problema esta en el uso del foreach para borrar los elementos.

Cuando eliminas los elementos, la coleccion Controls se reacomoda, en el foreach estas apuntando a un elemento cualquiera, digamos el primero de la coleccion, si lo eliminas, el segundo pasa a ser el primero, el tercer pasa a ser el segundo y asi sucesivamente, pero posteriormente, como estas haciendo un foreach, el apuntador pasa al siguiente elemento, el cual, en tu lista original era el tercero!!!!!

Espero que me entiendas lo que quiero decirte..

La solucion pasa por usar un for o un while en lugar del foreach. Por ejemplo, al usar el while puedes hacer algo como

While ( i <> Me.Controls.Count )
o = Me.Controls.Item ( i )
if ( o.Name = "borrar" ) then
Me.Controls.Remove(o)
else
i = i+1
end if
Wend

En este caso, solo te mueves a la siguiente posicion de la coleccion si no tienes que eliminar un elemento, ya que si el nombre es borrar y tienes que eliminarlo, en la i-esima posicion encontrarás el siguiente elemento a revisar

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar