Удалить элементы управления во время выполнения с помощью контекстного меню в С#

Я создаю несколько пользовательских элементов управления (кнопок) внутри 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);
        }
    }

person alex Alex    schedule 04.04.2014    source источник


Ответы (3)


Вы можете сначала объявить метод:

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

Затем измените существующий код на:

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

Сделанный.

person Diryboy    schedule 04.04.2014

Вы можете сделать это в событии MouseUp:

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

Это удалит кнопку, по которой вы щелкнули правой кнопкой мыши. Если вы хотите, вы можете добавить свой цикл, а также код контекстного меню, который вы не опубликовали. Не оставляйте это так, так как это, по меньшей мере, удивительное поведение.

person TaW    schedule 04.04.2014

Вы также можете попробовать

Button btn = sender as Button;
FlowLayoutPanel panel = btn.Parent as FlowLayoutPanel;
panel.Controls.Remove(btn);
person csharpwinphonexaml    schedule 04.04.2014