如何动态创建 C# 面板
How to create dynamically C# panels
我创建了一个联系人管理器。用户已经可以输入一些,它们存储在一个文件中,并在程序启动时重新打开。每个联系人都是我的 Person class.
的一个对象
启动程序时(在 Load() 中)我创建了一个 for 循环,直到探索完所有联系人(联系人在 Person table 中打开时存储)
所以现在我来解决我的问题:
我有一个可滚动的面板(我已启用该选项),我希望每隔 50 像素高度创建一个新面板,其中包含名称、名字、电子邮件和 phone 个我的联系人和图片框。
除了,我希望能够动态地完成它,而不是创建相同的东西超过 50 次并重复相同的代码 50 次
因为目前我已经这样做了:
for(int i = 0; i < contacts.Count; i++) //Afficher les contacts
{
if(!panel_contact1.Visible)
{
panel_contact1.Visible = true;
label_prenom_nom1.Text = contacts[i].Prenom + " " + contacts[i].Nom;
label_email1.Text = contacts[i].mail;
label_tel1.Text = contacts[i].tel;
pictureBox1.Image = Image.FromFile(contacts[i].pathImage);
}
else if(!panel_contact2.Visible)
{
panel_contact2.Visible = true;
label_prenom_nom2.Text = contacts[i].Prenom + " " + contacts[i].Nom;
label_email2.Text = contacts[i].mail;
label_tel2.Text = contacts[i].tel;
pictureBox2.Image = Image.FromFile(contacts[i].pathImage);
}
}
这只是前两个联系人的代码,我不想重复最多 100 次。
所以我的问题是:
如何创建面板,在每个标签和图片框中,面板中每 50 像素。
感谢您的阅读,如果您的建议总是相同的,如果你们都有代码,我是接受者,特别是因为我认为这应该很容易做到,因为标签的内容已经在动态教学.
谢谢。
如果您正在使用 windows 表单,请使用 Person 对象创建一个带有构造函数的用户控件,将标签和图片框设置为该人的信息。在您发布的主循环中,创建一个新实例并将其位置设置为 0,i * 50 将其置于前一个之下。
示例:
for(int i = 0; i < contacts.Count; i++)
{
YourUserControl u1 = new YourUserControl(pass the person object);
Panel1.Controls.Add(u1);
u1.Location = new Point(0, i * 50);
}
这取决于您使用的显示技术(WinForms、WPF/UWP、ASP.NET、其他)。
在 Windows Forms 中,您只需创建元素并将它们添加到容器中。设计者在部分 class 的自己的部分上工作。设计器代码为 运行,构造函数中为 InitializeComponents()
。它能做的,你也能做。而且你可以轻松查看。
在WPF/UWP中的东西有点复杂。设计师不在代码上工作,而是在 XAML,一种专用标记语言上工作。您不应该从代码中手动向 UI 添加任何内容。 WPF/UWP 和 XAML 的设计考虑了 MVVM 模式。处理事物列表是它最擅长的事情。虽然您可以使用其他模式,但通常会失去 90% 的功能,并且 运行 会在每个其他角落出现问题。
对于ASP.Net,这取决于您使用的模式。虽然 MVC 最初不是为它设计的,但它在 WebApplication 中非常受欢迎。这么多,它几乎是 WebApplications 和 ASP.NET 的代名词。然而,这看起来不像一个网络应用程序。
在 WinForms 上,你可以使用这个:
int x = 0;
int y = 0;
int delta = 10;
for ( int i = 0; i < contacts.Count; i++ )
{
// Create picture box
var picture = new PictureBox();
picture.Image = Image.FromFile(contacts[i].pathImage);
picture.Location = new Point(x, y);
picture.Size = new Size(picture.Image.Width, picture.Image.Height);
int dx = picture.Width + delta;
// Create name label
var labelName = new Label();
labelName.AutoSize = true;
labelName.Location = new Point(x + dx, y);
labelName.Font = new Font(labelName.Font, FontStyle.Bold);
labelName.Text = contacts[i].Prenom + " " + contacts[i].Nom;
// Create mail label
var labelMail = new Label();
labelMail.AutoSize = true;
labelMail.Location = new Point(x + dx, y + labelName.Height);
labelMail.Text = contacts[i].mail;
// Create phone label
var labelPhone = new Label();
labelPhone.AutoSize = true;
labelPhone.Location = new Point(x + dx, y + labelName.Height + labelMail.Height);
labelPhone.Text = contacts[i].tel;
// Add controls
panel.Controls.Add(picture);
panel.Controls.Add(labelName);
panel.Controls.Add(labelMail);
panel.Controls.Add(labelPhone);
// Iterate
int dy1 = labelName.Height + labelMail.Height + labelPhone.Height;
int dy2 = picture.Height;
y += Math.Max(dy1, dy2) + delta;
}
但您可能更喜欢创建一个自定义控件,您可以在其中放置一个图片框和三个根据您的需要设计的带有颜色、字体大小、粗体、边距、边框样式等的标签,高度为 50。
使用 Project > Add > User control
添加新的用户自定义控件并选择一个文件名,例如 PersonControl
。
public partial class PersonControl : UserControl
{
public PersonControl()
{
InitializeComponent();
}
public PersonControl(Person person) : this()
{
pictureBox.Image = Image.FromFile(person.pathImage);
labelName.Text = person.Prenom + " " + person.Nom;
labelMail.Text = person.mail;
labelPhone.Text = person.tel;
}
}
int x = 0;
int y = 0;
for ( int i = 0; i < contacts.Count; i++ )
{
var control = new PersonControl(contacts[i]);
control.Location = new Point(x, y);
panel.Controls.Add(control);
y += control.Height;
}
您应该注意文件图像的大小,它必须与图片框的大小相同,否则您需要通过调整大小来管理它。
How to resize an Image C#
我创建了一个联系人管理器。用户已经可以输入一些,它们存储在一个文件中,并在程序启动时重新打开。每个联系人都是我的 Person class.
的一个对象启动程序时(在 Load() 中)我创建了一个 for 循环,直到探索完所有联系人(联系人在 Person table 中打开时存储)
所以现在我来解决我的问题:
我有一个可滚动的面板(我已启用该选项),我希望每隔 50 像素高度创建一个新面板,其中包含名称、名字、电子邮件和 phone 个我的联系人和图片框。
除了,我希望能够动态地完成它,而不是创建相同的东西超过 50 次并重复相同的代码 50 次
因为目前我已经这样做了:
for(int i = 0; i < contacts.Count; i++) //Afficher les contacts
{
if(!panel_contact1.Visible)
{
panel_contact1.Visible = true;
label_prenom_nom1.Text = contacts[i].Prenom + " " + contacts[i].Nom;
label_email1.Text = contacts[i].mail;
label_tel1.Text = contacts[i].tel;
pictureBox1.Image = Image.FromFile(contacts[i].pathImage);
}
else if(!panel_contact2.Visible)
{
panel_contact2.Visible = true;
label_prenom_nom2.Text = contacts[i].Prenom + " " + contacts[i].Nom;
label_email2.Text = contacts[i].mail;
label_tel2.Text = contacts[i].tel;
pictureBox2.Image = Image.FromFile(contacts[i].pathImage);
}
}
这只是前两个联系人的代码,我不想重复最多 100 次。
所以我的问题是: 如何创建面板,在每个标签和图片框中,面板中每 50 像素。
感谢您的阅读,如果您的建议总是相同的,如果你们都有代码,我是接受者,特别是因为我认为这应该很容易做到,因为标签的内容已经在动态教学.
谢谢。
如果您正在使用 windows 表单,请使用 Person 对象创建一个带有构造函数的用户控件,将标签和图片框设置为该人的信息。在您发布的主循环中,创建一个新实例并将其位置设置为 0,i * 50 将其置于前一个之下。
示例:
for(int i = 0; i < contacts.Count; i++)
{
YourUserControl u1 = new YourUserControl(pass the person object);
Panel1.Controls.Add(u1);
u1.Location = new Point(0, i * 50);
}
这取决于您使用的显示技术(WinForms、WPF/UWP、ASP.NET、其他)。
在 Windows Forms 中,您只需创建元素并将它们添加到容器中。设计者在部分 class 的自己的部分上工作。设计器代码为 运行,构造函数中为 InitializeComponents()
。它能做的,你也能做。而且你可以轻松查看。
在WPF/UWP中的东西有点复杂。设计师不在代码上工作,而是在 XAML,一种专用标记语言上工作。您不应该从代码中手动向 UI 添加任何内容。 WPF/UWP 和 XAML 的设计考虑了 MVVM 模式。处理事物列表是它最擅长的事情。虽然您可以使用其他模式,但通常会失去 90% 的功能,并且 运行 会在每个其他角落出现问题。
对于ASP.Net,这取决于您使用的模式。虽然 MVC 最初不是为它设计的,但它在 WebApplication 中非常受欢迎。这么多,它几乎是 WebApplications 和 ASP.NET 的代名词。然而,这看起来不像一个网络应用程序。
在 WinForms 上,你可以使用这个:
int x = 0;
int y = 0;
int delta = 10;
for ( int i = 0; i < contacts.Count; i++ )
{
// Create picture box
var picture = new PictureBox();
picture.Image = Image.FromFile(contacts[i].pathImage);
picture.Location = new Point(x, y);
picture.Size = new Size(picture.Image.Width, picture.Image.Height);
int dx = picture.Width + delta;
// Create name label
var labelName = new Label();
labelName.AutoSize = true;
labelName.Location = new Point(x + dx, y);
labelName.Font = new Font(labelName.Font, FontStyle.Bold);
labelName.Text = contacts[i].Prenom + " " + contacts[i].Nom;
// Create mail label
var labelMail = new Label();
labelMail.AutoSize = true;
labelMail.Location = new Point(x + dx, y + labelName.Height);
labelMail.Text = contacts[i].mail;
// Create phone label
var labelPhone = new Label();
labelPhone.AutoSize = true;
labelPhone.Location = new Point(x + dx, y + labelName.Height + labelMail.Height);
labelPhone.Text = contacts[i].tel;
// Add controls
panel.Controls.Add(picture);
panel.Controls.Add(labelName);
panel.Controls.Add(labelMail);
panel.Controls.Add(labelPhone);
// Iterate
int dy1 = labelName.Height + labelMail.Height + labelPhone.Height;
int dy2 = picture.Height;
y += Math.Max(dy1, dy2) + delta;
}
但您可能更喜欢创建一个自定义控件,您可以在其中放置一个图片框和三个根据您的需要设计的带有颜色、字体大小、粗体、边距、边框样式等的标签,高度为 50。
使用 Project > Add > User control
添加新的用户自定义控件并选择一个文件名,例如 PersonControl
。
public partial class PersonControl : UserControl
{
public PersonControl()
{
InitializeComponent();
}
public PersonControl(Person person) : this()
{
pictureBox.Image = Image.FromFile(person.pathImage);
labelName.Text = person.Prenom + " " + person.Nom;
labelMail.Text = person.mail;
labelPhone.Text = person.tel;
}
}
int x = 0;
int y = 0;
for ( int i = 0; i < contacts.Count; i++ )
{
var control = new PersonControl(contacts[i]);
control.Location = new Point(x, y);
panel.Controls.Add(control);
y += control.Height;
}
您应该注意文件图像的大小,它必须与图片框的大小相同,否则您需要通过调整大小来管理它。
How to resize an Image C#