Создавать объекты из списка с циклом в C#
Предыстория: По большей части, я самоучка на C#, поэтому я прошу прощения, если это какая-то простодушная проблема. Я создаю что-то с эффектом списка рассылки (у каждого объекта есть имя, адрес, контактная информация и т. Д.), И я буду печатать его на этикетках (будет две колонки и четыре строки на печатной странице). У меня есть список в форме, где вы можете добавлять, редактировать и удалять отдельные метки, и у меня есть форма printPreview (одна) для отдельных записей, выбранных из списка.
Проблема: я пытаюсь создать форму предварительного просмотра для всего списка; создание группового блока (содержащего текстовое поле и графическое окно) для каждого объекта из списка - таким образом, у меня будет ровно количество меток в качестве объектов - затем заполните каждый блок содержимым, соответствующим каждому объекту в списке. Каждое групповое поле, текстовое поле и графическое поле имеют определенные размеры и будут располагаться так, чтобы между каждой меткой было место. Вот псевдокод, который я пытаюсь реализовать;
//box[num] contains
//text box at location(6,19)
//picture box at location(222,19)
int locX = 0;
int locY = 0;
listObj = list.first;
for (int i = 0; i < list.count; i++)
{
//create box[i] at location (locX, locY);
box[i].textbox.text = listObj.text;
box[i].picturebox.image = Image.FromFile(listObj.photoLocation);
if(i%2)
{
locX+=400;
}
else
{
locY+=248;
locX=0;
}
listObj = listObj.next;
}
Теперь я знаю, что там много дыр, но мне просто нужно базовое: как мне заставить мою программу создавать новые групповые блоки в форме, равной количеству объектов в моем списке?
1 ответ
Твоя формулировка немного сбивает меня с толку, но я попытаюсь решить эту проблему. Прости меня, если я далеко.
Ответить на прямой, простой ответ; добавление групповой рамки в форму:
GroupBox groupbox1 = new System.Windows.Forms.GroupBox();
groupbox1.Location = new System.Drawing.Point(x, y);
form1.Controls.Add(groupbox1);
Textbox textbox = new System.Windows.Forms.Textbox();
textbox.Location = new System.Drawing.Point(x2, y2);
groupbox1.Controls.Add(textbox);
// same for picturebox, where x/x2 and y/y2 are your calculated
// placements of the controls
Чтобы сделать их равными количеству в вашем списке, потребуется какая-то итерация; вам нужно будет либо создать список и добавить их, либо просто для (i=0 -> N) добавить их. Вы должны будете решить математику для размещения, хотя для каждого, в зависимости от того, как вы хотите, чтобы он выглядел (поля, отступы, размер и т. Д.)
Теперь немного подробнее:
Я думаю, что TableLayoutPanel или FlowLayoutPanel очень хорошо подходят для того, что вы делаете. Перетащите Table/FlowLayoutPanel в свой диалог, а затем в своем коде программно создайте свои групповые блоки и добавьте их в таблицу. Оба отлично справляются с управлением. Если вы заранее определяете размер таблицы, вам не нужно беспокоиться о поиске местоположений, вы можете просто добавлять их по одному, а макетная панель обрабатывает все остальное.
foreach(GroupBox groupbox in labelGroupBoxes)
{
tableLayoutPanel.Controls.Add(groupbox);
}
Я думаю, вам стоит взглянуть на это несколько вещей. FlowlayoutPanel, TableLayoutPanel и свойство Autosize элементов управления winform немногочисленны. Создайте свою новую форму, добавьте панель макета, начните создавать групповые блоки нужного размера меток, установите размеры строк / столбцов табличной табличной панели на AutoSize, если вы ее используете, и начните их вставлять.
Вот довольно хорошее видео на панели раскладки стола, я не могу найти то, что я искал...
http://msdn.microsoft.com/en-us/vstudio/Video/bb798032
Видео на Flowlayoutpanel: