如何动态创建C#面板

时间:2019-11-02 19:35:04

标签: c# dynamic panel

我创建了一个联系人管理器。用户已经可以输入一些内容,并且将它们存储在文件中,并在程序启动时重新打开。每个联系人都是我的Person类的对象。

启动程序时(在Load()中),我创建了一个for循环,直到探究了所有联系人(在Person表中打开时存储了联系人)

现在我要解决我的问题:

我有一个可滚动的面板(我已启用该选项),我希望每50像素高,创建一个新面板,其中包含联系人的姓名,名字,电子邮件和电话号码以及一个PictureBox。

喜欢:enter image description here

除了,我希望能够动态地做到这一点,而不是创建相同的事物超过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>

谢谢。

3 个答案:

答案 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;
}

您应该注意所有文件图像的大小都必须与图片框相同,否则您需要通过调整大小来进行管理。

How to resize an Image C#

答案 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应用程序。