Как удалить конкретную панель с помощью обработки событий в FlowlayoutPanel для моего приложения Windows Form? - PullRequest
0 голосов
/ 04 ноября 2011

Для моего приложения C # Windows Form я создал панель Flowlayout, которая содержит несколько панелей. Внутри панели у меня есть кнопка «Очистить» для каждой панели.

Как мне написать обработчик событий для кода для кнопки «Очистить», чтобы после нажатия этой кнопки панель была как бы «Удалена» из панели потока.

Это короткая часть кода добавления панелей в панель управления.

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

EDIT

код для создания моей панели

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

однако выдает ошибку В экземпляре объекта не задана ссылка на объект. на панели. Линия удаления ().

кто-нибудь может помочь?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Метод Controls.Remove () является очень опасным, он не располагает элементом управления. Который будет жить дальше, перенесен в так называемое окно парковки, используя как Windows, так и управляемые ресурсы. После чуть менее 10000 раз это приводит к сбою вашей программы, когда Windows больше не желает позволить вам создавать больше окон.

Вместо этого вызовите метод Dispose () элемента управления. Это также автоматически удаляет элемент управления из его контейнера.

void buttonClear_Click(object sender, EventArgs e)
{
    var panel = nFlowPanel.Controls["notifyPanel"];
    panel.Dispose();
}
0 голосов
/ 04 ноября 2011

Я предложу вам использовать список для этого. Прежде чем добавлять Panels в FlowLayoutpanel, добавьте их в список. Затем просто удалите проиндексированную панель из панели Flowlayout.

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

Чтобы получить индекс кнопки, вы должны добавить свои кнопки также в свой список и, нажав любую кнопку, найти кнопку в списке и получить индекс кнопки, в которой она сохранена в списке. Если мой код неясен, дайте мне знать. но я чувствую, что ваша задача настолько сложна. Я не уверен, но эта ссылка может помочь.

Надеюсь, это поможет.

0 голосов
/ 04 ноября 2011

Вы можете сделать это так:

nFlowPanel.Controls.Remove((sender as Button).Parent);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...