2013-10-05 152 views
4

我有这个程序动态地添加了指向数据库中总裁数量的picturebox。我如何把它们放在groupbox里面并且把groupbox里的picturebox放进去?如果图片盒很多,组盒应该伸展。在c#winforms控件中水平和垂直对齐动态添加控件

我现在有这样的代码:

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(); 
     } 
    } 

我想的pictureboxes是组框内部,里面对齐。

+0

检查码头和锚性质 – 2013-10-05 00:58:41

+0

但我编程方式添加的控件不在设计。那么我该怎么做呢? –

+0

然后以编程方式设置属性 – 2013-10-05 01:30:02

回答

11

也许FlowLayoutPanel控制已经做了什么你正在尝试做的。只需创建您的图片框并将其添加到FlowLayoutPanel而不是GroupBox

FlowLayoutPanel根据其属性的值自动排列行和/或列中的控件。设置myFlowLayoutPanel.FlowDirection = FlowDirection.TopDown以获得垂直排列的列表。

如果您不希望多行或列将WrapContents属性设置为false。如果控件不合适,您还可以将AutoScroll属性设置为true以自动获取滚动条。

如果您希望边框为GroupBox,则仍然可以将FlowLayoutPanel置入GroupBox

要调整图片框之间的空间,您可以使用Margin属性。

这给了你很多的布局控制,你不需要计算控制位置。另外,如果FlowLayoutPanel的大小发生更改,则所有内容都会自动重新排列。

UPDATE:

我对你的代码的一些意见:

  1. 大括号使这个看起来像一个对象初始化的语法 - 但事实并非如此。

    GroupBox PresGB = new GroupBox(); // this line ends with a semicolon 
    { 
        // therefore this is just a block of code not related to new GroupBox() 
    }; 
    

    您应该移除大括号。

  2. 组框的创建在循环内部。我怀疑你想为每个图片框添加一个新的分组框。这就是为什么你只看到一张照片的原因。每个新的组框都隐藏了以前的所有组件。

  3. 您将图片框添加到窗体而不是组框。

  4. 您使用“神秘”的名字。 PresGBPresPB很可能会被意外更换。缩写通常是名字的不好选择。

  5. 由于您不希望控件重叠,因此您无需致电SendToBackBringToFront

  6. 我不认为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(); 
+0

你能提供一个示例代码,指的是我的代码吗?因为它太复杂了。我不明白为什么我的照片箱只停留在一个位置。 –

+0

@LyndonBrozTonelete:我在代码中添加了一些代码和一些评论。 – pescolino

+0

非常感谢..你真的是一个很大的帮助。 :) –

0

您可以随时在窗体上放置一个控件,做你想做的事,然后看看设计器生成的代码,看看设计器是如何做到的(在“Designer.cs”文件中)。在后台加载所有控件并通过代码设置所有属性。

这就是说。

请记住,一旦将图片框放入组框中,所有位置坐标都与组框相关。因此,“0,0”是组框的左上角,而不是表单。

锚您的PictureBox使用下面的代码(这仅仅是一个直复制粘贴从我的设计器生成的代码,这样你就可以清理了一下):

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); 
+0

谢谢,但我仍然需要将pictureboxes对齐内部。例如,如果我的PresCount等于4,那么它会在groupbox内动态创建picturebox。它所做的就是中心/填满组框。其他pictureboxes不能被看见。 –