C# 每行生成4个动态按钮和浮动标签

C# 每行生成4个动态按钮和浮动标签,c#,winforms,loops,C#,Winforms,Loops,我有一张桌子。我正在使用SQL将所有数据检索到此循环中: using (SqlConnection con = new SqlConnection(@"ConnectionString")) { try { using (var cmd = new SqlConnection(@"ConnectionString"))

我有一张桌子。我正在使用SQL将所有数据检索到此循环中:

           using (SqlConnection con = new SqlConnection(@"ConnectionString"))
            {
                try
                {

                    using (var cmd = new SqlConnection(@"ConnectionString"))
                    {

                        var select3 = "SELECT name,number FROM services";

                        // Open connection
                        cmd.Open();
                        // Create command
                        SqlCommand cmd3 = new SqlCommand(select3, cmd);
                        // Create data reader
                        SqlDataReader rdr3 = cmd3.ExecuteReader();
                        // Loop through result set


                        while (rdr3.Read())
                        {

                          Button b = new Button();
                            b.Location = new Point(150 * (i % 4) + 12, 30 * i + 10);
                            b.Height = 179;
                            b.Width = 119;
                            b.Text = (rdr3["number"].ToString().Trim());
                            b.Name = string.Format("b_{0}", i + 1);
                            //b.Click += b_Click;
                            //b.Dock = DockStyle.Fill;
                            Controls.Add(b);

                            Label lbl = new Label();
                            lbl.Location = new Point(150 * (i % 4) + 12, 30 * i + 10);
                            lbl.Text = (rdr3["name"].ToString().Trim());
                            lbl.Tag = i;
                            Controls.Add(lbl);
//end dynamic generation
                        }
                        // Close data reader
                        rdr3.Close();

                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error during insert! " + ex);
                }
            }
*此代码的唯一问题是,所有按钮和标签都按如下方式推到第一行:

所以我希望这个循环每行只显示4个按钮和4个标签,并且没有行数限制。结果应该是这样的:


提示:请不要使用FlowLayoutPanel和TableLayoutPanel,因为它们不合适,因为它们不允许标签在按钮上方的x、x位置浮动。

您正在明确设置按钮和标签的位置属性

b.Location = new Point(12, 30 * i + 10);
但是,您只是在一个方向上改变了关于i的位置。你可能需要改变两个方向。差不多

b.Location = new Point( 100 * (i/4) + 12, 30 * (i%4) + 10);
通过将第一个值增加i/4的倍数,每4个按钮向下移动一次,并将第二个值更改为使用i%4的倍数,该值将在每一新行上重置


您可能需要将该值乘以i/4,以获得符合您需求的合理值

谢谢!!我刚才对你的直觉解释投了赞成票!!我仔细考虑了你的建议,现在这似乎足够解决问题位置=新点200*I%4+12,30*I/4+10;这就是它的样子:你能帮助更多的变量吗?谢谢,这是一个很好的回答,但仍然没有回答问题。如果有人带东西来,我会等的。再次谢谢你!我已经找到了一个很好的解决办法,真是太棒了!!