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

时间:2011-11-04 06:47:41

标签: c# winforms user-interface

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

如何为“Clear”按钮的代码编写事件处理程序,以便在单击按钮后,面板将从flowlayoutpanel中“删除”。

这是将面板添加到flowlayoutpanel的代码的一小部分。

        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();
    }

然而它给出了错误 你调用的对象是空的。 在panel.Dispose()行。

任何人都可以提供帮助吗?

3 个答案:

答案 0 :(得分:2)

Controls.Remove()方法非常危险,它不会丢弃控件。将继续使用,移动到所谓的停车窗口,同时使用Windows和托管资源。执行此操作不到10,000次后,当Windows不再允许您创建更多窗口时,它会崩溃您的程序。

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

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

答案 1 :(得分:0)

你可以这样做:

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

答案 2 :(得分:0)

我建议您使用List。在Panels中添加FlowLayoutpanel之前,请在列表中添加它们。然后只需从flowlayoutpanel中删除索引面板。

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

要获取按钮的索引,您还必须将按钮添加到列表中,单击任何按钮后,搜索列表中的按钮并获取列表中保存按钮的索引。如果我的代码不清楚,请告诉我。但我觉得你的任务很复杂。 I am not sure but this link may be of some help.

希望它有所帮助。