在c#winforms中的控件内水平和垂直对齐动态添加的控件
我有这个程序,动态添加图片框,引用数据库中的总统数。 如何将它们放在combobox中并将图片框对齐到组框内? 如果图片框很多,则组框应该拉伸。
我现在有这个代码:
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
控件已经完成了你想要做的事情。 只需创建图片框并将其添加到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();
您可以随时删除表单上的控件,执行您想要执行的操作,然后查看设计器生成的代码以查看设计器如何执行此操作(在“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);
对此:
上述就是C#学习教程:在c#winforms中的控件内水平和垂直对齐动态添加的控件分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注---计算机技术网(www.ctvol.com)!
PresGB.Controls.Add(PresPB);
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1000466.html