我有这个程序动态添加图片框,引用数据库中的总统数。如何将它们放入组合框并将图片框对齐到组框内?如果图片框很多,组框应该拉伸。
我现在有这个代码:
private void Form1_Load(object sender, EventArgs e)
{
conn.Open();
try
{
cmd = new SqlCommand("SELECT COUNT(Position) FROM TableVote WHERE Position='" + "President" + "'", conn);
Int32 PresCount = (Int32)cmd.ExecuteScalar();
TxtPresCount.Text = PresCount.ToString();
for (int i = 0; i < PresCount; ++i)
{
GroupBox PresGB = new GroupBox();
{
PresGB.Size = new Size(491, 152);
PresGB.Location = new Point(12, 12);
PresGB.Text = "President";
this.Controls.Add(PresGB);
PresGB.SendToBack();
PictureBox PresPB = new PictureBox();
PresPB.Location = new Point(80 + (150 * i) + 20, 50);
PresPB.Size = new Size(75, 75);
PresPB.BorderStyle = BorderStyle.Fixed3D;
PresPB.ImageLocation = "imgPath";
this.Controls.Add(PresPB);
PresPB.BringToFront();
};
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
conn.Close();
}
}
我希望图片框在组框内,并将其对齐。
答案 0 :(得分:15)
也许FlowLayoutPanel
控件已经完成了您要执行的操作。只需创建图片框并将其添加到FlowLayoutPanel
而不是GroupBox
。
FlowLayoutPanel
会根据其FlowDirection
属性的值自动排列行和/或列中的控件。设置myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown
以获得垂直排列的列表。
如果您不想要多行或多列,请将WrapContents
属性设置为false。您还可以将AutoScroll
属性设置为true,以便在控件不适合时自动获取滚动条。
如果您希望拥有GroupBox
的边框,仍然可以将FlowLayoutPanel
放入GroupBox
。
要调整图片框之间的空间,您可以使用Margin
属性。
这使您可以对布局进行大量控制,而无需计算控制位置。此外,如果FlowLayoutPanel
的大小发生变化,则会自动重新排列所有内容。
<强>更新强>
我对您的代码有一些评论:
花括号使它看起来像对象初始值设定项的语法 - 但事实并非如此。
GroupBox PresGB = new GroupBox(); // this line ends with a semicolon
{
// therefore this is just a block of code not related to new GroupBox()
};
你应该删除大括号。
组框的创建在循环内。我怀疑你想为每个图片框添加一个新的组框。这就是为什么你只看到一张图片的原因。每个新的组框都隐藏了之前的所有组。
您可以将图片框添加到表单而不是组框。
您使用“神秘”的名字。 PresGB
和PresPB
很可能会被意外交换。缩写通常是名称的不良选择。
您无需致电SendToBack
或BringToFront
,因为您不希望控件重叠。
我认为GroupBox
不是一个好选择。当然,如果图片数量增加,你可以把它做得更大,但是你受到屏幕的限制,如果图片框不适合你就不会得到scollbars。使用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();
答案 1 :(得分:0)
您始终可以删除表单上的控件,执行您想要执行的操作,然后查看设计器生成的代码以查看设计器的操作方式(在“Designer.cs”文件中)。在幕后,它正在加载所有控件并通过代码设置所有属性。
话虽如此。
请记住,一旦将图片框放入组框内,所有位置坐标都与组框相关。所以“0,0”是组框的左上角,而不是表格。
要锚定您的图片框,请使用以下代码(这只是我设计师生成的代码中的直接复制粘贴,因此您可以稍微清理一下):
this.PresPB.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
停靠图片框(因此它会填满整个控件):
this.PresPB.Dock = System.Windows.Forms.DockStyle.Fill;
您还需要更改此行:
this.Controls.Add(PresPB);
到此:
PresGB.Controls.Add(PresPB);