如何在Windows窗体应用程序的FlowlayoutPanel中通过事件处理删除特定面板

本文关键字:删除 事件处理 Windows 窗体 应用程序 FlowlayoutPanel | 更新日期: 2023-09-27 18:13:41

对于我的C#Windows窗体应用程序,我创建了一个包含多个面板的流程布局面板。在面板内部,我为每个面板都有一个"清除"按钮。

我该如何为按钮"清除"的代码编写事件处理程序,以便一旦我单击该按钮,面板就会从流程布局面板中"移除"。

这是将面板添加到流程布局面板的代码的一个简短部分。

        nFlowPanel.Controls.Add(createNotificationPanel());
        nFlowPanel.Controls.Add(createNotificationPanel());
        nFlowPanel.Controls.Add(createNotificationPanel());
        nFlowPanel.Controls.Add(createNotificationPanelImpt());
        nFlowPanel.Controls.Add(createNotificationPanelImpt());

这是按钮"清除"的代码

Button btnClear = new Button
        {
            Text = "Clear",
            Name = "btnClear",
            Location = new Point(416, 17)
        };
        p.Controls.Add(btnClear);
        btnClear.Click += new EventHandler(buttonClear_Click);

那么,我应该在下面的方法中写些什么来去除例如在我写的代码的第一部分中添加的第二个面板?

void buttonClear_Click(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

编辑

创建我的面板的代码是

var p = new Panel 
        {
             BorderStyle = BorderStyle.FixedSingle , 
             Size = new Size(506,100),
             Name = "notifyPanel"
        };

创建FlowLayoutPanel的代码是

var nFlowPanel = new FlowLayoutPanel
        {
            FlowDirection = FlowDirection.TopDown,
            WrapContents = false,
            AutoScroll = true,
            Size = new Size(530, 377),
            Location = new Point(13, 145)
        };

我清除按钮的代码是

void buttonClear_Click(object sender, EventArgs e)
    {
        var button = (Control)sender;
        var panel = button.Parent.Controls["notifyPanel"];
        panel.Dispose();
    }

但是它给出了错误对象引用未设置为对象的实例。在面板上。Dispose((行。

有人能帮忙吗?

如何在Windows窗体应用程序的FlowlayoutPanel中通过事件处理删除特定面板

Controls.Remove((方法非常危险,它不处理控件。它将继续存在,移动到所谓的停车窗口,同时使用Windows和托管资源。这样做不到10000次后,当Windows不再愿意让你创建更多窗口时,它会使你的程序崩溃。

请改为调用控件的Dispose((方法。这也会自动将控件从其容器中删除。

void buttonClear_Click(object sender, EventArgs e)
{
    var panel = nFlowPanel.Controls["notifyPanel"];
    panel.Dispose();
}

你可以这样做:

nFlowPanel.Controls.Remove((sender as Button).Parent);

我建议您为此使用List。在FlowLayoutpanel中添加Panels之前,请将它们添加到列表中。然后,只需从流程布局面板中删除索引面板即可。

Panel pnlTemp = (panel)list[index];
nFlowPanel.Controls.Remove(pnlTemp);

要获取按钮的索引,您必须将按钮也添加到列表中,单击任何按钮后,在列表中搜索按钮,并获取保存在列表中的按钮的索引。如果我的代码不清楚,请告诉我。但我觉得你的任务很复杂。我不确定,但这个链接可能会有所帮助。

希望能有所帮助。