如何动态创建 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#