向可滚动面板添加位置信息

4

我正在使用一个Panel来容纳一组控件(由用户定义)。我添加这些面板的方式是,在将其添加到面板之前,基于Panel.Controls.Count设置控件的位置。

comRec.Location = new Point(comRec.Location.X, panel1.Controls.Count * 25);
panel1.Controls.Add(comRec);

现在,这个功能运行得很好,看起来也和我想要的一样。然而,一旦我们到达窗口的限制,AutoScroll 就会启用(我确实希望如此)。现在,如果用户滚动到 Panel 的底部,这将最终改变面板中每个控件的位置。我的第一个 comRec.Location 不再是 (0,0),而是像 (0,-219) 这样的位置。所以现在,当用户添加另一个 comRec 对象时,它会在对象之间创建一个巨大的间隔。
我的问题是,如何在滚动条更改位置的情况下考虑位置的变化,并仍然使用我的添加系统。我假设需要检查滚动条的值并使用它来确定位置。
另外,有没有更好的方法来显示控件列表?我应该使用一个 Panel 吗?
3个回答

5

这看起来像是解决问题的方法!然而,FlowDirection属性有点令人困惑。当您打开AutoScroll时,需要使用LeftToRight而不是TopDown来滚动垂直面板。 - Kyle Uithoven
1
TableLayoutPanel 也值得一看。 - Justin
既然我已经有了一个用户控件并且它内部处理了所有的值,我认为FlowLayoutPanel更适合我的情况,但还是感谢提供另一种选择。在未来的开发中,我会记住这两个选项。 - Kyle Uithoven
@Kyle:是的,有时候可能会有点混淆(也许有点奇怪!),但是当你知道如何使用它时,它就像魔法一样好用! :) - Kipotlov
我所确定的意思是:TopDown 表示当它到达底部时,会向右移动,导致水平滚动。LeftToRight 会在右侧添加,直到达到面板的边缘,然后移动到底部,导致垂直滚动。由于面板只足够容纳一个控件,因此它完美地工作。 - Kyle Uithoven

1
您可以将另一个面板添加到层次结构中:
Outer panel (scrollable)
    Inner panel (not scrollable, resize it whenever you add a control)
        User Defined Control 1
        User Defined Control 2
        User Defined Control 3
        User Defined Control 4
        ...

这样,您的附加控件位置将相对于它们的直接父级,即非滚动面板。


谢谢您的回答,这确实有效,但是FlowLayoutPanel比仅使用Panels更干净、更好。 - Kyle Uithoven

1
如果您添加了多个控件,请在添加控件时尝试暂停面板的布局:
panel1.SuspendLayout();
// Add controls ...
panel1.ResumeLayout();

这在一个类似的情况中对我很有帮助,用户可以动态改变现有控件的可见性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接