在 C# winforms 的控件内水平和垂直对齐动态添加的控件

2024-05-09

我有这个程序,可以动态添加引用数据库中总统号码的图片框。如何将它们放入组框内并对齐组框内的图片框?如果图片框很多,则组框应该拉伸。

我现在有这个代码:

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

我希望图片框位于组框内并在内部对齐。


也许是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:

我对你的代码有几点评论:

  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. 你使用“神秘”的名字。PresGB and PresPB很可能会被意外交换。缩写通常是一个糟糕的名称选择。

  5. 你不需要打电话SendToBack or BringToFront因为无论如何你都不希望控件重叠。

  6. 我不认为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(); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C# winforms 的控件内水平和垂直对齐动态添加的控件 的相关文章

随机推荐