我有一张桌子services
。使用 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);
}
}
*此代码的唯一问题是所有按钮和标签都在第一行中被推送如下:
所以我希望这个循环显示 ONLY 4个按钮和4个标签每行,并且没有行数限制。结果应该是这样的:
提示: 请不要理会 FlowLayoutPanel和TableLayoutPanel ,因为它们不合适,因为它们往往不允许Label浮动(x, x)按钮上方的位置。
答案 0 :(得分:1)
您正在明确设置按钮的位置属性并标记
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
的值来获得符合您需求的内容。