C# 每行生成4个动态按钮和浮动标签
我有一张桌子。我正在使用SQL将所有数据检索到此循环中:C# 每行生成4个动态按钮和浮动标签,c#,winforms,loops,C#,Winforms,Loops,我有一张桌子。我正在使用SQL将所有数据检索到此循环中: using (SqlConnection con = new SqlConnection(@"ConnectionString")) { try { using (var cmd = new SqlConnection(@"ConnectionString"))
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;这就是它的样子:你能帮助更多的变量吗?谢谢,这是一个很好的回答,但仍然没有回答问题。如果有人带东西来,我会等的。再次谢谢你!我已经找到了一个很好的解决办法,真是太棒了!!