You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中如何获取点击按钮名称并删除动态生成的按钮?

解决方案

核心思路是通过上下文菜单的SourceControl属性直接获取对应的按钮实例,不用依赖按钮名称——毕竟你所有按钮名称都一样,靠名称区分本来就行不通。

1. 动态创建按钮和上下文菜单的代码

private void AddDynamicButton()
{
    Button newButton = new Button();
    newButton.Text = "统一按钮名";
    newButton.Size = new Size(120, 35);
    // 自动排版位置,避免重叠
    newButton.Location = new Point(30, 30 + this.Controls.OfType<Button>().Count() * 45);

    // 创建右键菜单
    ContextMenuStrip btnMenu = new ContextMenuStrip();
    ToolStripMenuItem deleteOption = new ToolStripMenuItem("DeleteCity");
    // 绑定删除事件
    deleteOption.Click += DeleteCity_Click;
    btnMenu.Items.Add(deleteOption);

    newButton.ContextMenuStrip = btnMenu;
    this.Controls.Add(newButton);
}

2. 处理DeleteCity的点击事件

private void DeleteCity_Click(object sender, EventArgs e)
{
    // 拿到点击的菜单项
    ToolStripMenuItem clickedMenu = sender as ToolStripMenuItem;
    if (clickedMenu == null) return;

    // 拿到菜单项所属的上下文菜单
    ContextMenuStrip parentMenu = clickedMenu.Owner as ContextMenuStrip;
    if (parentMenu == null) return;

    // 关键:获取触发菜单的按钮
    Button targetButton = parentMenu.SourceControl as Button;
    if (targetButton != null)
    {
        // 从窗体控件集合中移除
        this.Controls.Remove(targetButton);
        // 释放控件资源,防止内存泄漏
        targetButton.Dispose();
    }
}

注意事项

  • 如果你的动态按钮是放在Panel、GroupBox这类容器里的,要把this.Controls.Remove改成对应容器的Controls.Remove,比如panel1.Controls.Remove(targetButton)。
  • 一定要调用Dispose(),不然被移除的按钮还会占用内存。

内容的提问来源于stack exchange,提问作者Sultan Çepni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 07:45:29