我创建了一个联系人管理器。用户已经可以输入一些内容,并且将它们存储在文件中,并在程序启动时重新打开。每个联系人都是我的Person类的对象。
启动程序时(在Load()中),我创建了一个for循环,直到探究了所有联系人(在Person表中打开时存储了联系人)
现在我要解决我的问题:
我有一个可滚动的面板(我已启用该选项),我希望每50像素高,创建一个新面板,其中包含联系人的姓名,名字,电子邮件和电话号码以及一个PictureBox。
除了,我希望能够动态地做到这一点,而不是创建相同的事物超过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次。
所以我的问题是: 如何创建面板,在每个标签和一个PictureBox中,面板中每隔50px。
谢谢您的阅读,如果您有建议,并且所有人都拥有相同的代码,请始终保持相同,尤其是因为我认为应该很容易做到,因为标签的内容已经在动态地教学了。 / p>
谢谢。
答案 0 :(得分:1)
在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;
}
您应该注意所有文件图像的大小都必须与图片框相同,否则您需要通过调整大小来进行管理。
答案 1 :(得分:0)
如果您使用的是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);
}
答案 2 :(得分:0)
这取决于您使用的显示技术(WinForms,WPF / UWP,ASP.NET等)。
在 Windows窗体中,您只需创建元素并将其添加到容器中即可。设计者认为它是局部类的一部分。设计器代码在构造函数中与InitializeComponents()
一起运行。它可以做的任何事情,您都可以做。您可以轻松查看它。
在 WPF / UWP 中,东西要复杂一些。设计器不能使用代码,而可以使用专用的标记语言XAML。您不应从代码中手动向UI添加任何内容。 WPF / UWP和XAML在设计时考虑了MVVM模式。处理事物列表是最有效的方法。虽然可以使用其他模式,但通常会失去90%的功能,并在其他每个角落都遇到问题。
对于ASP.Net,这取决于您使用的夹心模式。虽然最初不是为此设计的,但MVC在WebApplication中非常流行。如此,它几乎与WebApplications和ASP.NET是同步的。但是,这看起来不像Web应用程序。