2012-06-22 11 views

Respuesta

10

Usted puede utilizar LINQ, esta es una manera de hacerlo.

canvas1.Children.OfType<Button>().ToList().ForEach(b => canvas1.Children.Remove(b)); 

O puede recorrer todos los elementos secundarios y, si se trata de un botón, agregarlos a una lista y finalmente eliminarlos. no quite los botones dentro del ciclo foreach.

List<Button> toRemove = new List<Button>(); 
foreach (var o in canvas1.Children) 
{ 
    if (o is Button) 
     toRemove.Add((Button)o); 
} 
for (int i = 0; i < toRemove.Count; i++) 
{ 
    canvas1.Children.Remove(toRemove[i]); 
} 

LINQ way es más legible y simple y menos codificación.

+2

Finalmente, simple y correcto. ¡Gracias! Algunas notas sobre el rendimiento? – Nick

+0

@Nick no habrá diferencia de rendimiento en LINQ y normal, prefiero el modo LINQ. es su elección decidir cuál prefirió – Damith

+2

Voto abajo Por favor deje un comentario, si hay algo mal aquí – Damith

0

Algunos LINQ:

panel1.Controls.OfType<Button>().ToList().ForEach((b) => b.Parent = null); 

Lo siento por todos los chicos errores. Corrección hecha y probada.

+2

-1 panel.Controles? ¿Has probado? http://msdn.microsoft.com/en-us/library/system.windows.controls.panel – Nick

+0

** - 1 ** 'Children.OfType

+0

Inténtalo de nuevo .. .pero por favor estar seguro. – Nick

3

Haga una comparación de tipos. La parte engañosa es modificar una colección mientras la revisas; Hice esto mediante el uso de dos bucles for:

var ToRemove = new List<UIElement>(); 
Type t = typeof(Button); 
for (int i=0 ; i<MyPanel.Children.Count ; i++) 
{ 
    if (MyPanel.Children[i].GetType()) == t) 
     ToRemove.Add(MyPanel.Children[i]); 
} 
for (int i=0 ; i<ToRemove.Length ; i++) MyPanel.Children.Remove(ToRemove[i]); 

Editar

De esta manera es más limpio, de enlace desde el final de la colección, con el fin de eliminar elementos de dentro del bucle.

Type t = typeof(Button); 
for (int i=MyPanel.Children.Count-1 ; i>=0 ; i--) 
{ 
    if (MyPanel.Children[i].GetType()) == t) 
     MyPanel.Children.RemoveAt(i); 
} 
+1

El bucle for que forma bucles el final de la colección debe comenzar con 'MyPanel.Children.Count - 1'; de lo contrario, obtendrá' IndexOutOfRangeException'. –

+0

@NikolaAnusev gracias, corregido. – McGarnagle

0

Winging esto de mi teléfono:

foreach(object o in MyPanel.Children) 
{ 
    if(o.GetType() == typeof(Button)) 
    { 
     MyPanel.Children.Remove(o); 
    } 
} 
+3

Esto no funcionará ya que no puede eliminar elementos de una colección mientras itera sobre ella con foreach. –

+0

Ah, ¿cuándo van a hacer VS para el iPhone para que pueda probar mi código primero = P – Jmyster

Cuestiones relacionadas