【问题标题】:How to create dynamically C# panels如何动态创建 C# 面板
【发布时间】:2019-11-02 19:35:04
【问题描述】:

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

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

所以现在我来解决我的问题:

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

除了,我希望能够动态地执行它,而不是创建相同的东西超过 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在一个面板中。

感谢您的阅读,如果您的建议总是一样的,如果你们都有代码,我是一个接受者,特别是因为我认为它应该很容易做到,因为标签的内容已经动态教学。

谢谢。

【问题讨论】:

  • 你在使用 wpf 吗?
  • 不知道是什么,是设计师VS代码的申请表
  • @RayaneStaszewski 答案因每种显示技术而异。
  • 在 Visual Studio 中创建新项目时,必须在不同类型的项目之间进行选择。例如。 “Windows 窗体应用程序”(winforms)、“WPF 应用程序”等。如果你有一个 winforms,那么你有一个对 System.Windows.Forms 的引用。如果您有 WPF 应用程序,则可以参考 PresentationCore

标签: c# dynamic panel


【解决方案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 &gt; Add &gt; 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#

【讨论】:

  • 我从未见过如此详细的答案!非常感谢。我写了并按照你的回答,但是当我启动我的应用程序时,我的面板中什么都没有出现,但滚动条被激活你有解决方案吗?
  • 不,没关系,因为我的 userControl 在面板中,它可以工作!非常感谢,你救了我的命!!!!
【解决方案2】:

如果您使用的是 Windows 窗体,请使用 Person 对象创建一个带有构造函数的用户控件,将标签和图片框设置为该人的信息。在您发布的主循环中,创建 this 的新实例并将其位置设置为 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);
    }

【讨论】:

    【解决方案3】:

    这取决于您使用的显示技术(WinForms、WPF/UWP、ASP.NET 等)。

    Windows 窗体 中,您只需创建元素并将它们添加到容器中。设计师在它自己的部分类中工作。设计器代码在构造函数中使用InitializeComponents() 运行。它可以做的任何事情,你都可以做。并且您可以轻松查看。

    WPF/UWP 中的东西有点复杂。设计器不处理代码,而是处理 XAML,一种专用标记语言。您不应该从代码中手动向 UI 添加任何内容。 WPF/UWP 和 XAML 在设计时考虑了 MVVM 模式。处理清单是它最擅长的。虽然您可以使用其他模式,但通常会失去 90% 的功能,并且在每个角落都会遇到问题。

    对于 ASP.Net,这取决于您使用的模式。虽然最初不是为它设计的,但 MVC 在 WebApplication 中非常流行。如此之多,它几乎是 WebApplications 和 ASP.NET 的代名词。但是,这看起来不像是 Web 应用程序。

    【讨论】:

    • 没错,我使用设计器,但它不允许动态创建元素,这就是我要显示我的联系人的内容。我在一个论坛上读到我应该创建一个面板,在其中放置标签并每 10 像素复制一次
    • @RayaneStaszewski 您还没有指定显示技术。如果没有这些信息,我们将无法帮助您。通常包含指令足以识别它。
    猜你喜欢
    • 2020-04-07
    • 2017-06-20
    • 2012-07-24
    • 2011-07-22
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多