是否可以找到flowlayoutPanel中可见的userControl

时间:2016-09-15 10:08:48

标签: c# winforms user-controls

我有FlowLayoutPanel我动态添加50 UserControl。面板垂直放置,每个用户控件都有一些只读的标签。

我使用this.KeyPreview = true; 在表单中,我可以使用事件处理程序Form1_KeyUp来捕获keyUp事件。 在这个事件处理程序中,我捕获导航按钮 PageUp PageDown

单击导航按钮时,在面板中选择了上一个UserControl,单击时,选择了下一个UserControl。这很好用。

客户还希望能够使用我在前面提到的事件处理程序Form1_KeyUp中捕获的 PageUp PageDown

我希望我能找到哪些UserControl可见。假设在面板中可以看到索引为1,2,3,4的UserControl,那么当我单击<时使用 PageUp 和用户控制索引4时,我可以在索引1处选择用户控件KBD>下页

欢迎任何帮助。

3 个答案:

答案 0 :(得分:2)

您可以使用此类代码:

var controls = container.Controls.Cast<Control>().OrderBy(x => x.Top);
var visibles = controls.Where(l => container.ClientRectangle.IntersectsWith(l.Bounds));
var top = visibles.FirstOrDefault();
var bottom = visibles.LastOrDefault();

在上面的代码中,我首先按Top命令对容器进行了控制。然后使用IntersectsWith我发现那些控件的边界与容器的客户端矩形相交,这意味着这些控件是可见的。

由于列表是按控件的Top属性排序的,因此第一项是容器顶部的可见项,最后一项是容器底部的可见项。

注意

  • 您可以使用Cast<Control>
  • 代替OfType<YourUserControl>
  • 您可以使用OrderBy(x => x.Top)
  • 代替OrderByDescending(x => container.Controls.IndexOf(x))
  • 您可以使用container.ScrollControlIntoView(top);或底部控件container.ScrollControlIntoView(bottom);
  • 将顶部控件置于视图中
  • 如果您有FlowLayoutPanel AutoScroll=True FlowDirection=TopDownWrapContents=False,那么您可以使用Panel代替,只需在添加用户控件时设置{ {1}}为他们。

答案 1 :(得分:0)

如果我理解正确,这就是你的意思

 public List<Control> GetvisibleControls(Control parent)
            {
                List<Control> returnList = new List<Control>();
                foreach(Control child in parent.Controls)
                {
                    if (child.Location.X < parent.Width && child.Location.Y < parent.Height)
                        returnList.Add(child);
                }
                return returnList;
            }

答案 2 :(得分:0)

如果你的意思是可见,可见属性是真的,请使用&#39; Shannon Holsinger&#39;回答:

如果您的意思是可以看到控件的至少一个像素,请在所有控件上循环,并使用此答案检查控件是否可见

C# winform check if control is physicaly visible