在运行时使用 C# 中的上下文菜单删除控件

本文关键字:上下文 菜单 删除 控件 运行时 | 更新日期: 2023-09-27 17:56:39

我在 tabControl 内创建了一些自定义控件(按钮),该控件在运行时通过拖动文件来包含 FLP。当我右键单击按钮并从上下文菜单中选择删除时,我想删除按钮。我的问题是我怎么知道我右键单击哪个按钮要删除?

如何创建按钮:

 public void tabControl1_DragDrop(object sender, DragEventArgs e)
    {
        string[] fileList = e.Data.GetData(DataFormats.FileDrop) as string[];
        foreach (string s in fileList)
        {
            var button = new Button();
            CustomControl custom_btn = new CustomControl(button, new Label { Text = file_name,  BackColor = Color.Red });
            button.Tag = path_app;
            FlowLayoutPanel selectedFLP = (FlowLayoutPanel)tabControl1.SelectedTab.Controls[0];
            selectedFLP.Controls.Add(custom_btn);
            ContextMenu cm2 = new ContextMenu();
            cm2.MenuItems.Add("Remove", new EventHandler(rmv_btn_click));
            custom_btn.ContextMenu = cm2;
        }
    }
我尝试删除按钮

,但没有删除我选择的按钮。

 private void rmv_btn_click(object sender, System.EventArgs tab)
    {
        //flp_panel.Controls.Remove(sender as Button); - not working because the sender is actually the button "remove" from the context menu..
        foreach (Control X in flp_panel.Controls)
        {
            flp_panel.Controls.Remove(X);
        }
    }

在运行时使用 C# 中的上下文菜单删除控件

您可以先声明一个方法:

private EventHandler handlerGetter( Button button )
{
    return ( object sender, EventArgs e ) =>
    {
        flp_panel.Controls.Remove(button); 
    };
}

然后将现有代码修改为:

cm2.MenuItems.Add("Remove", handlerGetter(custom_btn));

做。

您可以在 MouseUp 事件中执行此操作:

    private void rmv_btn__MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
            flp_panel.Controls.Remove( (Button) sender);
    }

这将删除您右键单击的按钮。如果你愿意,你可以添加你的循环以及你没有发布的上下文菜单代码。不要这样离开它,因为至少可以说这是一种令人惊讶的行为。

你也可以试试

Button btn = sender as Button;
FlowLayoutPanel panel = btn.Parent as FlowLayoutPanel;
panel.Controls.Remove(btn);