我已经设置了一个程序,当选中末尾的复选框时,该程序会添加新行。我的问题在于自动滚动。当行通过窗口的边缘时,它会创建下一行,但看起来它将原点设置为上一行的起点。
以下是一些代码:
private void AddRow(object sender, EventArgs e)
{
bool check = ((CheckBox)sender).Checked;
if (check)
{
proj[i] = new Label();
proj[i].Text = "Proj #";
proj[i].Width = 50;
proj[i].Location = new Point(10, (i * 22) + 50);
...
split[i] = new CheckBox();
split[i].Text = "";
split[i].Location = new Point(430, (i * 22) + 50);
split[i].CheckedChanged += new EventHandler(AddRow);
}
this.Controls.Add(proj[i]);
}
以下是一些截图:
如何解决此问题?
答案 0 :(得分:1)
问题在于自动滚动的行为方式。向下滚动时,自动滚动行为实际上会遍历所有控件,并通过调整其Top
属性将其向上移动。这肯定会使添加另一行变得困难。两个简单的选项:
选项1 :将每一行控件添加到自己的面板中(或者,最好创建一个包含它们的UserControl
)。然后将每个面板添加到FlowLayoutPanel
或GridLayoutPanel
,这将为您计算坐标。
-OR -
选项2 :不使用(i * 22) + 50
,而是使用:
if (i == 0)
proj[i].Location = new Point(10, 50);
else
proj[i].Location = new Point(10, proj[i-1].Top + 22);
同样适用于所有其他控件。
第一种选择是更好的做法,但第二种选择可能是更快的直接解决方案。您还应该考虑使用网格控件,尤其是在行数可能很大的情况下。