5

我无法删除按钮单击事件中动态添加的控件。让我知道如何做到这一点。

public void populateform(ArrayList list)
{
  int i = 1;
  int count = 0;

  foreach (string cartitems in list)
  {
    Label lbl = new Label();
    lbl.Name = "myLabel"+i;

    lbl.Content = cartitems.ToString();
    mystackpanel.Children.Add(lbl);
    i++;
    ++count;
    if (count % 3 == 0)
    {
      Button btndelete = new Button();
      btndelete.Content = "Delete";

      btndelete.Width = 120;
      btndelete.Height = 35;
      btndelete.Click += new RoutedEventHandler(btndelete_Click);

      mystackpanel.Children.Add(btndelete);                    
    }
  }
}

private void btndelete_Click(object sender, RoutedEventArgs e)
{
  Label lbl2 = (Label)this.mystackpanel.FindName("myLabel2");
  this.mystackpanel.Children.Remove(lbl2);               
}
4

2 回答 2

8

FindName的备注部分:

FindName 在当前元素的名称范围内运行。有关详细信息,请参阅WPF XAML 名称范围

简而言之,您必须调用RegisterName才能FindName为动态创建的元素工作。

lbl.Name = "myLabel" + i;
lbl.Content = cartitems;
mystackpanel.Children.Add(lbl);
mystackpanel.RegisterName(lbl.Name, lbl); // here

但是,如果不使用FindName.

var element = mystackpanel.Children
    .OfType<FrameworkElement>()
    .FirstOrDefault(e => e.Name == "myLabel2")
于 2013-09-23T13:54:59.693 回答
4
Label lbl = (Label)LogicalTreeHelper.FindLogicalNode(mystackpanel, "myLabelx");
mystackpanel.Children.Remove(lbl);
于 2013-09-23T14:07:07.843 回答