9

私は WPF を持っていますPanel(Canvasたとえば) 。Childrenこれらの子が type の場合にのみT、たとえば all の typeの場合にのみ削除しButtonます。

これどうやってするの?LINQ を使用できますか?

4

4 に答える 4

12

LINQ を使用できます。これは 1 つの方法です。

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

または、すべての子要素をループして、ボタンの場合はそれらをリストに追加して、最後に削除することができます。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 の方法は、より読みやすく、シンプルで、コーディングが少なくなります。

于 2012-06-22T17:48:41.747 に答える
3

タイプの比較を行うだけです。トリッキーな部分は、ループ中にコレクションを変更することです。2 つの 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]);

編集

この方法はよりクリーンで、コレクションの最後からループして、ループ内からアイテムを削除します。

Type t = typeof(Button);
for (int i=MyPanel.Children.Count-1 ; i>=0 ; i--)
{
     if (MyPanel.Children[i].GetType()) == t)
         MyPanel.Children.RemoveAt(i);
}
于 2012-06-22T17:29:14.440 に答える
0

いくつかの LINQ:

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

すべての間違いをお詫びします。修正およびテスト済み。

于 2012-06-22T17:28:59.790 に答える
0

これを私の電話から飛ばす:

foreach(object o in MyPanel.Children)
{
    if(o.GetType() == typeof(Button))
    {
        MyPanel.Children.Remove(o);
    }
}
于 2012-06-22T17:38:05.947 に答える