删除一个面板中所有动态创建的面板
Delete all dynamically created panels in a panel
我有一个联系人管理应用程序(您帮了我很多忙:D),在我的主窗体上有一个名为 panel_contact 的面板。里面有包含显示联系人的面板:
但这是我的问题:
当我创建联系人时,contact_panel 会重新加载以添加我刚刚创建的联系人。比如下图中我添加了Jackie,你可以看到第一个联系人自己复制了,这不是我想要的。
那么如何删除 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);
}
}
}
这是项目的 link:
https://www.mediafire.com/file/sb06mnajgm57vn1/Contact.rar/file
假设我们继续 用户控制解决方案,您可以这样写:
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();
我有一个联系人管理应用程序(您帮了我很多忙:D),在我的主窗体上有一个名为 panel_contact 的面板。里面有包含显示联系人的面板:
但这是我的问题: 当我创建联系人时,contact_panel 会重新加载以添加我刚刚创建的联系人。比如下图中我添加了Jackie,你可以看到第一个联系人自己复制了,这不是我想要的。
那么如何删除 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);
}
}
}
这是项目的 link: https://www.mediafire.com/file/sb06mnajgm57vn1/Contact.rar/file
假设我们继续
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();