C# 如何在滚动期间在自动滚动面板中查找第一个可见标签

C# 如何在滚动期间在自动滚动面板中查找第一个可见标签,c#,winforms,panel,C#,Winforms,Panel,你好,我有个问题。 我有一个面板,其中包含例如1000个标签控件,用于控制Windows窗体应用程序中每个标签的高度是可变的,我将查找垂直滚动面板时在面板中看到的第一个标签的位置 这是我的面板和标签控件的屏幕截图: 您可以在控件集合上循环,直到找到标签: Label getTopLabel(Panel container) { for (int y = 0; y < 60; y+= 10) { Label lbl = (Label)container.Get

你好,我有个问题。 我有一个
面板
,其中包含例如1000个
标签
控件,用于控制Windows窗体应用程序中每个标签的高度是可变的,我将查找垂直滚动面板时在面板中看到的第一个标签的位置

这是我的
面板
标签
控件的屏幕截图:


您可以在
控件
集合上循环,直到找到
标签

Label getTopLabel(Panel container)
{
    for (int y = 0; y < 60; y+= 10)
    {
        Label lbl = (Label)container.GetChildAtPoint(new Point(20, y));
        if (lbl != null) return lbl;
    }
    return null;
}

您可以在容器
面板中找到顶部
标签
控件
,而不考虑其大小和距离,方法如下:

private void container_Scroll(object sender, ScrollEventArgs e)
{
    var labels = container.Controls.OfType<Label>().OrderBy(x => x.Top);
    var top = labels.Where(l => container.ClientRectangle.IntersectsWith(l.Bounds))
                    .FirstOrDefault();
    if (top != null)
    {
        this.Text = top.Name;
        top.BackColor = Color.Gold;
        labels.Except(new[] { top }).ToList().ForEach(x => x.BackColor = Color.Silver);
    }
}
private void container\u滚动(对象发送方,ScrollEventArgs e)
{
var labels=container.Controls.OfType().OrderBy(x=>x.Top);
var top=labels.Where(l=>container.ClientRectangle.IntersectsWith(l.Bounds))
.FirstOrDefault();
如果(顶部!=null)
{
this.Text=top.Name;
top.BackColor=Color.Gold;
labels.Except(new[]{top}).ToList().ForEach(x=>x.BackColor=Color.Silver);
}
}
在上面的代码中,我首先根据标签的
Top
在标签上执行了一个order by,然后得到了其绑定与容器面板相交的第一个标签

要查找顶部项目的位置,请在找到它后,使用
top.Location


哦!TaW此代码仅适用于滚动,但当我单击“向上”或“向下”时,它不起作用什么是“向上”和“向下”?另外:您可以轻松地将其转换为函数,并随时调用。感谢您的解决方案权限,您的解决方案是正确的(您的解决方案是正确的)
private void container_Scroll(object sender, ScrollEventArgs e)
{
    var labels = container.Controls.OfType<Label>().OrderBy(x => x.Top);
    var top = labels.Where(l => container.ClientRectangle.IntersectsWith(l.Bounds))
                    .FirstOrDefault();
    if (top != null)
    {
        this.Text = top.Name;
        top.BackColor = Color.Gold;
        labels.Except(new[] { top }).ToList().ForEach(x => x.BackColor = Color.Silver);
    }
}