【问题标题】:Adding to a Scrollable Panel with Location添加到带有位置的可滚动面板
【发布时间】:2011-07-23 02:13:02
【问题描述】:

我正在使用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吗?

【问题讨论】:

    标签: c# .net user-controls panel


    【解决方案1】:

    如果添加多个控件,请尝试在添加控件时暂停面板的布局:

    panel1.SuspendLayout();
    // Add controls ...
    panel1.ResumeLayout();
    

    这在用户可以动态更改现有控件的可见性的类似情况下帮助了我。

    【讨论】:

      【解决方案2】:

      您可以在层次结构中添加一个额外的面板:

      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 比仅使用面板做得更干净、更好。
      【解决方案3】:

      看看FlowLayoutPanel控件,这正是你想要的。

      【讨论】:

      • 这看起来可以解决问题!但是,FlowDirection 属性有点令人困惑。开启 AutoScroll 后,垂直滚动面板需要使用 LeftToRight 而不是 TopDown。
      • TableLayoutPanel 可能也值得一看。
      • 由于我已经制作了一个用户控件并且它在内部处理所有值,我喜欢 FlowLayoutPanel 更适合我的情况,但感谢您的替代方案。在未来的开发过程中,我会牢记这两点。
      • @Kyle :是的,有时它有点令人困惑(也许很奇怪!)但是当你知道如何使用它时,它就像一个魅力! :)
      • 好吧,我确定它的意思是:TopDown 意味着当它到达底部时,它会向右移动,从而使其水平滚动。 LeftToRight 将在右侧添加,直到它碰到面板的边缘,然后移动到底部,使其垂直滚动。由于面板的宽度仅足以容纳我的一个控件,因此它可以完美运行。
      猜你喜欢
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      相关资源
      最近更新 更多