【问题标题】:Remove dynamically added Label on FlowLayoutPanel删除 FlowLayoutPanel 上动态添加的标签
【发布时间】:2011-10-25 04:01:25
【问题描述】:

我在FlowLayoutPanel上动态添加了Label,代码如下:

private void button1_Click(object sender, EventArgs e)
    {
        Label lb = new Label();
        lb.Text = "How are You";
        lb.Size = new Size(650, Font.Height +10);
        flowLayoutPanel1.Controls.Add(lb);
        flowLayoutPanel1.SetFlowBreak(lb, true);
        lb.BackColor = Color.Wheat;
    }

ContextMenuStrip 中我添加了两个 Item Add 和 Edit 并将其关联 FlowLayoutPanel,意味着当用户右键单击 FlowLayoutPanel 时,Edit 和删除菜单出现。

现在我想使用删除按钮 (ContextMenuStrip) 删除动态添加标签。我只想右键单击欲望标签,右键单击后应该将其删除。与编辑按钮相同的情况进行编辑。

【问题讨论】:

    标签: c# flowlayoutpanel


    【解决方案1】:

    在表单上保留对 lb 变量的引用(而不仅仅是在函数内部)。当你想删除它时,调用 flowLayoutPanel1.Controls.Remove(lb)。

    您应该将事件处理程序添加到标签的右键单击事件调用的同一子中。在这个处理程序内部是上面对 .Remove 的调用应该在的地方。

    另外,由于事件处理程序将传入发送者对象,该对象将引用触发事件的控件,因此您可以调用 .Remove 并传入发送者。您不必以这种方式保留对标签的引用,除非您需要它用于其他用途。

    请求示例

    flowLayoutPanel1.Controls.Remove((ToolStripMenuItem) sender);
    

    在 cmets 后再次编辑

    我把你button1的点击事件改成

    private void button1_Click(object sender, EventArgs e)
    {
         lb = new Label();
        lb.Text = "How are You";
        lb.Size = new Size(650, Font.Height +10);
        flowLayoutPanel1.Controls.Add(lb);
        flowLayoutPanel1.SetFlowBreak(lb, true);
        lb.BackColor = Color.Wheat;
        lb.MouseEnter += labelEntered;
    }
    

    如您所见,我添加了一个 MouseEntered 事件处理程序来捕获鼠标经过的最后一个标签。

    我添加了以下子,即上面提到的处理程序。它所做的就是记录鼠标经过的最后一个标签。

    private Label lastLabel;
    private void labelEntered(object sender, EventArgs e)
    {
        lastLabel = (Label)sender;
    }
    

    删除按钮的代码已经改成这个了。

    public void Remove_Click(object sender, EventArgs e)
    {
        if (lastLabel != null)
        {
            flowLayoutPanel1.Controls.Remove(lastLabel);
            lastLabel = null;
        }
    }
    

    它首先检查以确保 lastLabel 有一个值,如果这样做,它会删除鼠标经过的最后一个标签,然后清除 lastLabel 变量。

    【讨论】:

    • flowLayoutPanel1.Controls.Remove(lb) 在单个标签上运行正确,但是当我使用相同的按钮添加多个标签时(平均按钮按两次,它添加两个标签)然后它只删除最后一个。但是我想,当我右键单击愿望标签时,它应该删除的不是最后一个。
    • 我不知道您要添加多个“相同标签”。这样做会用新创建的实例覆盖前一个实例。尝试我提到的第二种方法,即删除发件人。您可能会将 sender 强制转换为控件,无论您添加多少它都应该工作。
    • 如果您提供我的代码作为示例,那么也许我实际上理解您的第二个替代解决方案。我明白你在说什么,但由于 c# 中的新功能,我无法在没有代码的情况下实现它。因此,示例代码将是可观的。并感谢您的回复
    • 我已经用一个例子更新了答案。只需用这个替换上一个删除我给你的调用即可。
    • 无法将“System.Windows.Forms.ToolStripMenuItem”类型的对象转换为“System.Windows.Forms.Label”类型。
    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    相关资源
    最近更新 更多