【问题标题】:Remove a button (User Control) from a panel in C#从 C# 的面板中删除按钮(用户控件)
【发布时间】:2021-10-19 11:29:07
【问题描述】:

我有一个 UserControl (UC),在那个 UC 中我有一个标签和一个图片框。
当我将许多 UC 添加到我的面板时,每当用户单击图片框时,我都需要删除 UC。
但是,我不能选择真正的 UC。

添加事件的UC代码:

public event EventHandler<EventArgs> X_click;

private void guna2PictureBox1_Click(object sender, EventArgs e)
{
    if (X_click != null)
    {
        X_click(guna2PictureBox1, new EventArgs());
    }
}

这是我选择和删除真正 UC 的代码:

private void a1_X_click(object sender, EventArgs e)
{
   foreach (Control item in guna2Panel1.Controls.OfType<addCatUC>())
   {
      if (sender == item)
      {
         guna2Panel1.Controls.Remove(item);
      }
   }
}

注意:我为所有 UC 添加事件a1_X_click

addC.X_click += new EventHandler<EventArgs>(a1_X_click);

【问题讨论】:

  • 你的意思是UserControl
  • 是的,我必须写 UserControl
  • guna2Panel1.Controls.Remove((addCatUC) sender); 应该足够了。不需要循环。您正在修改您正在循环的集合。那会做意想不到的事情。
  • 所有 UC 都是在应用运行时创建的
  • 我不知道用户点击哪个UC!!!

标签: c# user-controls panel windows-forms-designer


【解决方案1】:

我使用了这段代码并且能够移除正确的按钮:

    private void a1_X_click(object sender, EventArgs e)
    {
        ((Control)sender).Parent.Dispose();
    }

【讨论】:

  • 如果您需要引发该事件(也许您需要在处理之前从该 UserControl 获取信息?),然后:X_click((Control)sender).Parent, new EventArgs());
  • @HansPassant:我确实从您的编辑中学到了一些东西。有点遗憾的是,Control.Dispose 或 Component.Dispose 的描述没有提到该控件会从它所在的控件列表中删除它自己。我总是自己删除它。我假设其他一些迭代该列表的代码会访问它并获得 ObjectDisposedException。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-10
  • 2011-10-16
  • 2021-10-05
  • 2013-02-07
  • 2012-12-03
  • 1970-01-01
相关资源
最近更新 更多