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
相关产品推荐
相关产品推荐

