在 FlowLayoutPanel 中仅释放一个控件

本文关键字:一个 控件 FlowLayoutPanel 释放 | 更新日期: 2023-09-27 18:36:01

我正在做程序,通过按钮将标签添加到FlowLayoutPanel。它工作正常,但我添加了上下文菜单,只有一个项目用于删除所选标签。右键单击标签并选择"删除"时,我想处理此特定标签。它曾经有效,但现在不是了。

void fillFLP(FlowLayoutPanel FLP)
        {
            Label l = new Label();
            l.AutoSize = true;
            l.Text = textBox.Text;
            l.BackColor = Color.Red;
            l.Width = 150;
            l.AutoSize = true;
            l.MaximumSize = new Size(150, 200);
            l.MinimumSize = new Size(150, 25);
            l.Padding = new Padding(5);
            l.Margin = new Padding(25, 5, 25, 0);
            ContextMenuStrip deleting= new ContextMenuStrip();
            deleting.Items.Add("Delete");
            deleting.Click += new System.EventHandler(this.delete);
            l.ContextMenuStrip = deleting;
            FLP.Controls.Add(l);
            l.MouseDown += l_MouseDown;
            l.MouseMove += l_MouseMove;
            l.MouseUp += l_MouseUp;
        }
        private void delete(object sender, EventArgs e)
        {
            this.Dispose();
        }

感谢您的任何帮助。

在 FlowLayoutPanel 中仅释放一个控件

当然,

您处理了错误的对象。 它需要l,无法到达它,因为你把它变成了局部变量。 最优雅的方法是使用 lambda 表达式或匿名方法捕获它。 请注意,糟糕的名称选择也给您带来了麻烦,您订阅了错误的Click事件。 修复:

    ContextMenuStrip cms = new ContextMenuStrip();
    var deleting = cms.Items.Add("Delete");
    deleting.Click += delegate { l.Dispose(); };
    l.ContextMenuStrip = cms;