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