Как динамически создавать панели C # - PullRequest
0 голосов
/ 02 ноября 2019

Я создаю менеджер контактов. Пользователь уже может ввести некоторые из них, и они сохраняются в файле и повторно открываются при запуске программы. Каждый контакт является объектом моего класса Person.

При запуске программы (в Load ()) я создал цикл for, пока все контакты не будут исследованы (контакты сохраняются при открытии в таблице Person)

Итак, теперь я подхожу к своей проблеме:

У меня есть панель с возможностью прокрутки (я включил эту опцию), и мне бы хотелось, чтобы каждые 50 пикселей по высоте создавалась новая панель с именем, имя, адрес электронной почты и номер телефона моих контактов и картинки.

Примерно так: 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 раз.

Поэтому мой вопрос таков: как создавать панели, с каждой меткой и картинкой, каждые 50 пикселей на панели.

Спасибо, что прочитали, если выпросто совет всегда должен быть одинаковым, если у вас у всех есть код, который я беру, особенно потому, что я думаю, что это должно быть легко сделать, потому что содержание меток уже динамически обучает.

Спасибо.

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

На 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;
}

Но вы можете предпочесть создать пользовательский элемент управления, где вы помещаете графический блок и три метки, разработанные по вашему желанию, с цветами, размером шрифта, полужирным шрифтом, полем, borderstyle и т. д. с высотой 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;
}

. позаботьтесь о размере изображения файла, который должен быть одинаковым для всех и таким же, как и в графическом окне, иначе вам нужно управлять этим путем изменения размера, например.

Как изменить размер изображения C #

0 голосов
/ 02 ноября 2019

Это зависит от используемой вами технологии отображения (WinForms, WPF / UWP, ASP.NET и др.).

В Windows Forms вы просто создаете элементы и добавляете их вконтейнер. Дизайнер работает над своей частью частичного класса. Код конструктора запускается с InitializeComponents() в конструкторе. Все, что он может сделать, вы можете сделать. И вы можете легко посмотреть на это.

В WPF / UWP все немного сложнее. Дизайнер работает не с кодом, а с XAML, выделенным языком разметки. Вы не должны вручную добавлять что-либо в пользовательский интерфейс из кода. WPF / UWP и XAML были разработаны с учетом шаблона MVVM. И лучше всего справляться со списками вещей. В то время как вы можете использовать другие шаблоны, обычно они теряют 90% своей мощности и сталкиваются с проблемами на каждом другом углу.

Для ASP.Net это будет зависеть от того, какой шаблон вы используете. Хотя MVC изначально не был разработан для него, он был чрезвычайно популярен в WebApplication. Тем не менее, это почти синонимично с WebApplications и ASP.NET. Однако это не похоже на веб-приложение.

0 голосов
/ 02 ноября 2019

Если вы используете формы 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);
    }
...