如何在基于表单的程序中修复自动滚动以移动我的原点?

时间:2011-04-27 18:45:11

标签: c# forms controls

我已经设置了一个程序,当选中末尾的复选框时,该程序会添加新行。我的问题在于自动滚动。当行通过窗口的边缘时,它会创建下一行,但看起来它将原点设置为上一行的起点。

以下是一些代码:

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]);
   }

以下是一些截图: enter image description here

enter image description here

如何解决此问题?

1 个答案:

答案 0 :(得分:1)

问题在于自动滚动的行为方式。向下滚动时,自动滚动行为实际上会遍历所有控件,并通过调整其Top属性将其向上移动。这肯定会使添加另一行变得困难。两个简单的选项:

选项1 :将每一行控件添加到自己的面板中(或者,最好创建一个包含它们的UserControl)。然后将每个面板添加到FlowLayoutPanelGridLayoutPanel,这将为您计算坐标。

-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);

同样适用于所有其他控件。

第一种选择是更好的做法,但第二种选择可能是更快的直接解决方案。您还应该考虑使用网格控件,尤其是在行数可能很大的情况下。