0

背景:在大多数情况下,我是自学 C#,所以如果这是一些头脑简单的问题,我深表歉意。我正在创建邮件列表的效果(每个对象都有名称、地址、联系信息等),并将在标签中打印出来(每个打印页将有两列和四行)。我在 formMain 中有一个列表,您可以在其中添加、编辑和删除单个标签,并且我有一个用于从列表中选择的单个条目的表单 printPreview(one)。

问题:我正在尝试为整个列表创建打印预览表单;为列表中的每个对象生成一个组框(包含一个文本框和图片框)——这样我就可以将标签的数量作为对象——然后用列表中每个对象的内容填充每个框。每个组框、文本框和图片框都具有特定的大小,并且将被隔开,以便每个标签之间有空间。所以这是我试图实现的伪代码;

//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;
}

现在,我知道那里有很多漏洞,但我只需要基本的:如何让我的程序以等于列表中对象数量的形式创建新的组框?

4

1 回答 1

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

使它们的数量与列表中的数量相等将需要某种迭代;您必须创建一个列表并添加它们,或者只是 for(i=0 -> N) 添加它们。您必须根据您希望它的外观(边距、填充、大小等)计算出每个位置的数学。

现在,更详细一点:

我认为 TableLayoutPanel 或 FlowLayoutPanel 非常适合您正在做的事情。将 Table/FlowLayoutPanel 拖放到您的对话框中,然后在您的代码中以编程方式制作您的组框并将它们添加到表中。两者都非常擅长为您处理控制定位。如果您事先调整表格大小,则无需担心找到位置,您可以一次添加一个,然后布局面板处理其余部分。


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

我认为,您需要考虑几件事。Winform 控件的 FlowlayoutPanel、TableLayoutPanel 和 Autosize 属性是少数。创建你的新表单,添加一个布局面板,开始创建你想要的标签大小的组框,如果你使用那个,将 tablelayoutpanel 的行/列大小设置为 AutoSize,然后开始粘贴它们。

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

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

flowlayoutpanel 上的视频:

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

于 2012-05-11T04:51:45.893 回答