背景:在大多数情况下,我是用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;
}
现在,我知道那里有很多漏洞,但我只需要基本的:如何让我的程序以与列表中对象数量相等的形式创建新的组框?
答案 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的视频: