也许是FlowLayoutPanel http://msdn.microsoft.com/library/system.windows.forms.flowlayoutpanel.aspx控制已经做了你想做的事。只需创建您的图片框并将它们添加到FlowLayoutPanel
代替GroupBox
.
FlowLayoutPanel
根据其值自动将控件排列在行和/或列中FlowDirection http://msdn.microsoft.com/library/system.windows.forms.flowlayoutpanel.flowdirection.aspx财产。放myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown
获得垂直排列的列表。
如果您不需要多行或多列,请设置WrapContents http://msdn.microsoft.com/library/system.windows.forms.flowlayoutpanel.wrapcontents.aspx属性为 false。您还可以设置AutoScroll http://msdn.microsoft.com/library/system.windows.forms.scrollablecontrol.autoscroll.aspx属性设置为 true 以在控件不适合时自动获取滚动条。
如果您喜欢有边框GroupBox
你仍然可以把FlowLayoutPanel
into a GroupBox
.
要调整图片框之间的空间,您可以使用Margin http://msdn.microsoft.com/library/system.windows.forms.control.margin.aspx财产。
这使您可以对布局进行大量控制,并且无需计算控制位置。另外,如果尺寸FlowLayoutPanel
改变一切都会自动重新排列。
UPDATE:
我对你的代码有几点评论:
-
大括号使其看起来像对象初始值设定项的语法 - 但事实并非如此。
GroupBox PresGB = new GroupBox(); // this line ends with a semicolon
{
// therefore this is just a block of code not related to new GroupBox()
};
您应该删除花括号。
组框的创建是在循环内部进行的。我怀疑您是否想要为每个图片框一个新的组框。这就是为什么您只能看到一张图片的原因。每个新的组框都会隐藏所有以前的组框。
您将图片框而不是组框添加到表单中。
你使用“神秘”的名字。PresGB
and PresPB
很可能会被意外交换。缩写通常是一个糟糕的名称选择。
你不需要打电话SendToBack
or BringToFront
因为无论如何你都不希望控件重叠。
我不认为GroupBox
是一个不错的选择。当然,如果图片数量增加,您可以将其放大,但您受到屏幕的限制,并且如果图片框不适合,则不会获得滚动条。用一个FlowLayoutPanel
。它拥有您正在寻找的所有“魔力”。
将 for 循环替换为这段代码:
var panel = new FlowLayoutPanel();
panel.SuspendLayout(); // don't calculate the layout before all picture boxes are added
panel.Size = new Size(491, 152);
panel.Location = new Point(12, 12);
panel.BorderStyle = BorderStyle.Fixed3D;
panel.FlowDirection = FlowDirection.LeftToRight;
panel.AutoScroll = true; // automatically add scrollbars if needed
panel.WrapContents = false; // all picture boxes in a single row
this.Controls.Add(panel);
for (int i = 0; i < PresCount; ++i)
{
var pictureBox = new PictureBox();
// the location is calculated by the FlowLayoutPanel
pictureBox.Size = new Size(75, 75);
pictureBox.BorderStyle = BorderStyle.FixedSingle;
pictureBox.ImageLocation = "imgPath";
panel.Controls.Add(pictureBox);
}
panel.ResumeLayout();