使用C#中的循环从列表创建对象

时间:2012-05-11 04:16:33

标签: c# list groupbox

背景:在大多数情况下,我是用C#自学的,所以如果这是一个简单的问题我会道歉。我正在创建一些邮件列表的效果(每个对象都有名称,地址,联系信息等),并将在标签中打印出来(每个打印页面将有两个列和四行)。我有formMain中的列表,您可以在其中添加,编辑和删除单个标签,我有一个表单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 个答案:

答案 0 :(得分: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

将相同数量的数字作为列表中的数字需要某种迭代;你必须要么创建一个List并添加它们,要么只为(i = 0 - &gt; N)添加它们。你必须根据你想要的样子(边距,填充,大小等)计算每个位置的数学计算。

现在,更详细一点:

我认为TableLayoutPanel或FlowLayoutPanel非常适合你正在做的事情。将Table / FlowLayoutPanel拖放到对话框中,然后在代码中以编程方式创建组框并将它们添加到表中。两者都非常出色地为您处理控制定位。如果你事先调整了桌子的大小,你不必担心找到位置,你可以一次一个地添加它们,然后layoutpanel处理其余的。


foreach(GroupBox groupbox in labelGroupBoxes)
{
    tableLayoutPanel.Controls.Add(groupbox);
}

我认为,有几件事情你会想要这样做。 Winlay控件的FlowlayoutPanel,TableLayoutPanel和Autosize属性是一些。创建新表单,添加布局面板,开始创建所需标签大小的组框,如果使用该表格,则将tablelayoutpanel的行/列大小设置为AutoSize,然后开始粘贴它们。

这是一个关于桌面布局面板的相当不错的视频,我找不到我真正想要的那个......

http://msdn.microsoft.com/en-us/vstudio/Video/bb798032

关于flowlayoutpanel的视频:

http://msdn.microsoft.com/en-us/vstudio/Video/bb798028