Удалить все динамически созданные панели в панели - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть приложение для управления контактами (которое вы мне очень помогли: D), а в основной форме у меня есть панель с именем panel_contact. Внутри есть панели с контактами, которые отображаются:

enter image description here

Но вот моя проблема: когда я создаю контакт, contact_panel перезагружается, чтобы добавить одинЯ только что создал. Например, на рисунке ниже я добавил Джеки, и вы можете видеть, что первый контакт дублировался, а это не то, что я хочу.

enter image description here

Итак, как мне удалить все панели в моей contact_panel? Я уже пробовал:

panel_contact.Controls.Clear(); //Don't work
panel1.Invalidate(); //Don't work

У кого-нибудь есть решение, пожалуйста? Спасибо.

РЕДАКТИРОВАТЬ: ПОЛНЫЙ КОД:

namespace Contact
{
    public partial class Contact : Form
    {

        List<Personne> contacts = new List<Personne>(); //Contient tous les contacts

        public Contact()
        {
            this.Icon = AppResources.icon;
            InitializeComponent();
        }


        private void Picture_add_Click(object sender, EventArgs e)
        {
            //Ouvre la fenêtre de création de contact
            //Add.cs
            Add ajouterWindow = new Add();
            ajouterWindow.ShowDialog();

            this.Contact_Load(this, null);
        }

        private void Contact_Load(object sender, EventArgs e)
        {
            //Création des class contact depuis le fichier txt

            string path = System.IO.Path.GetFullPath(@"contact.txt");

            try
            {
                List<string> contactsBrut = File.ReadAllLines(path).ToList();

                string[] inforamtions = new string[15];
                string[] notes = new string[8];

                for (int i = 0; i < contactsBrut.Count; i++)
                {
                    inforamtions = contactsBrut[i].Split('#');

                    for (int z = 0; z < inforamtions.Length; z++) //remplace les valeurs incorrect par null
                    {
                        if (String.IsNullOrWhiteSpace(inforamtions[z]) || String.IsNullOrEmpty(inforamtions[z]))
                        {
                            inforamtions[z] = null;
                        }
                    }

                    int age = Convert.ToInt32(inforamtions[2]);
                    bool isMan = false;

                    if (inforamtions[4] == "True") {
                        isMan = true;
                    }
                    else {
                        isMan = false;
                    }

                    contacts.Add(new Personne(inforamtions[0], inforamtions[1], age, inforamtions[3], isMan,
                       inforamtions[5], inforamtions[6], inforamtions[7], inforamtions[8], inforamtions[9], inforamtions[10], inforamtions[11],
                       inforamtions[12], inforamtions[13], inforamtions[14], inforamtions[15]));
                }

            }
            catch
            {
                MessageBox.Show("Erreur avec les données de l'application"); 
            }

            //Afficher les contacts
            if(contacts.Count == 0)
            {
                label_aucunContact.Show();
            }
            else
            {
                label_aucunContact.Hide();

                ClearPanel();
                afficherContact();

            }
            //Continuation du load
        }

        private void afficherContact()
        {
            int x = 4;
            int y = 4;
            for (int i = 0; i < contacts.Count; i++)
            {
                var control = new PersonControl(contacts[i]);
                control.Location = new Point(x, y);
                panel_contact.Controls.Add(control);
                y += control.Height + 2;
            }
        }

        private void Picture_add_MouseHover(object sender, EventArgs e)
        {
            ToolTip tt = new ToolTip();
            tt.SetToolTip(this.picture_add, "Ajouter un contact");
        }

        private void ClearPanel()
        {
            foreach (var control in panel_contact.Controls.OfType<PersonControl>().ToList())
                panel_contact.Controls.Remove(control);
        }

    }
}

Вот ссылка на проект: https://www.mediafire.com/file/sb06mnajgm57vn1/Contact.rar/file

1 Ответ

1 голос
/ 03 ноября 2019

Предполагая, что мы продолжим ваш проект с решением для управления пользователями, вы можете написать:

using System.Linq;

private void ClearPersonControls(Panel panel)
{
  foreach ( var control in panel.Controls.OfType<PersonControl>().ToList() )
    panel.Controls.Remove(control);
}

Он получает все элементы управления на панели типа PersonControl.

Нам нужно создать List результата, чтобы избежать столкновения ссылок при удалении.

Далее мы делаем цикл с ним и просим панель удалить все элементы управления.

Использование:

private void UpdatePanel(Panel panel)
{
  ClearPersonControls(panel);
  CreatePersonControls(panel);
}

Где CreatePersonControls - это метод, содержащий код предыдущего вопроса для создания отображения с некоторыми PersonControl

Вы, конечно, можете поместить весь код вметод UpdatePanel одновременно, если не много строк, без создания Clear и Create. Делайте то, что вы чувствуете.

Если вам нужно, вы можете добавить обновление, но после просмотра кода в этом нет необходимости:

panel.Refresh();
...