【问题标题】:How to delete dynamically created buttons如何删除动态创建的按钮
【发布时间】:2014-09-23 12:35:27
【问题描述】:

我正在 c# 中创建一个 WPF 应用程序,我想知道如何在网格中删除动态创建的按钮,假设我知道按钮名称。

解释:我有 16 个按钮,我想在单击一个按钮时同时删除两个按钮。我有他们的名字,但我不知道如何使用它。

这是我尝试过的,但这仅在您尝试删除单击的按钮时才有用。

public void delete(Button x)
{
    myGrid.Children.Remove(x);
}

希望您能理解我的问题,因为我的英语不是我的母语。

我的代码:

for (int i=1; i<17; i++) 
{
    Button x = new Button();
    x.MinHeight = 100;
    x.MinWidth = 100;
    var brush = new ImageBrush();
    brush.ImageSource = new BitmapImage(new Uri(@"C:path\slikeSpomin\hrbtnaStran.png", UriKind.Relative));
    x.Background = brush;
    int ime = r.Next(0, max);
    //x.Content = pari[ime];
    x.Name = pari[ime];
    pari.RemoveAt(ime);
    max--;
    x.VerticalAlignment = VerticalAlignment.Top;
    x.HorizontalAlignment = HorizontalAlignment.Left;                
    x.Margin = new Thickness(a, b, 0, 0);
    a = a + 130;
    if (i % 4 == 0)
    {
        b = b + 120;
        a = 10;
    }
    x.Click += new RoutedEventHandler((obj, ev) => btnClick(x));
    gumbiDodani.Insert(0, x);
    gridSlike.Children.Add(x);

} // Here i create my buttons

private void btnClick(Button x)
{
    var brush = new ImageBrush();
    string slika = x.Name;
    sliki.Add(slika);
    brush.ImageSource = new BitmapImage(new Uri(@"path\slikeSpomin\" + slika + ".png", UriKind.Relative));
    x.Background = brush;
    //zaženem metodo, ki preverja enake in se izvede samo v primeru, če so enake
    enake(slika, x);
}
List<string> ksad = new List<string>();
public void enake(string ime, Button x)
{
    ksad.Add(ime);
    if (ksad.Count == 2)
    {
        string prva = ksad[0];
        string druga = ksad[1];
        if (prva.Equals(druga + "a") || druga.Equals(prva + "a"))
        {

            string imeGumba = x.Name;
            MessageBox.Show(prva + "   " + druga);
            //this.gridSlike.Children.re
            gridSlike.Children.Remove(x);
            ksad.Clear();
        }
        else 
        {
            MessageBox.Show("happy");
            ksad.Clear();
        }
    }
}

【问题讨论】:

  • 所以您的问题是如果您知道按钮的名称(字符串),如何获取对按钮的引用。
  • 在这里发布代码。您的问题可能有更好的解决方案。
  • 按钮是如何创建的?也发布此代码。
  • 是的 kennyzx 但有两个引用,因为我需要删除两个按钮。当我单击一个按钮时我得到的第一个参考,然后我使用我在我的问题中发布的代码删除了这个按钮。但我需要再删除一个按钮,但我不知道如何获得它的参考。我只有按钮名称
  • 你不能遍历 myGrid.children 并使用名称获取按钮吗?

标签: c# wpf


【解决方案1】:

我认为你可以做这样的事情让我们说按钮名称是 B1

 List<Button> remove = new List<Button>();
        foreach (var children in myGrid.Children)
        {
            if ((children.GetType() == typeof(Button)))
            {
                if ((children as Button).Name == "B1")
                    remove.Add(children as Button);
            }
        }
        foreach (var ch in remove)
        {
            myGrid.Children.Remove(ch as Button);
        }

或者干脆

myGrid.Children.Remove((UIElement) this.FindName("B1"));

就像 Asfk 在他的回答中提到的那样

【讨论】:

    【解决方案2】:

    使用这段代码:

    UIElement btn = null;
    foreach (Control c in sp.Children)
        if (c.Name == "Button1")
            btn = (UIElement)c;
    sp.Children.Remove(btn);
    

    顺便说一句,我找到了这个代码sp.Children.Remove((UIElement)this.FindName("Button0")); 不起作用的原因here

    初始加载和处理后对元素树的任何添加 必须为该类调用 RegisterName 的适当实现 定义 XAML 名称范围。否则,添加的对象不能 通过 FindName 等方法按名称引用。仅仅设置一个 名称属性(或 x:Name 属性)不会将该名称注册到 任何 XAML 名称范围。

    【讨论】:

    • 我已经尝试过了,但没有任何反应。此方法中的参数 FindName 是我的按钮名称对吗?
    【解决方案3】:

    也许是因为没有处理掉它。 (很多人都忽略了这一点。)让我们从 AsfK 的答案中获取代码:

    sp.Children.Remove(btn);
    

    试着改成这样:

    btn.Dispose();
    

    (如果下面的代码不起作用或出现错误,请尝试:“sp.Children.btn.Dispose();”)

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多