2016-09-06 9 views
-3

Здравствуйте, у меня есть вопрос. У меня есть Panel, который содержит, например, 1000 Label элементов управления, что высота каждой метки переменной в приложении Windows Forms, и я собираюсь найти положение первой метки, которая видна на панели при прокрутке панели по вертикали.Как найти первую видимую метку на панели автопрокрутки во время прокрутки

Вот скриншот моих Panel и Label управления:

enter image description here

ответ

3

Вы можете найти верхнюю Label управления в контейнере Panel независимо от их размеров и расстояния так:

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

В вышеприведенном коде я сначала выполнил порядок на ярлыках на основе их Top, затем я получил первую метку, ее граница которой пересекается с панелью контейнера.

Чтобы найти позицию сверху, после ее использования используйте top.Location.

enter image description here

1

Вы можете цикл над Controls коллекции, пока вы найти Label:

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

Мой пример предполагает, что без зазора между двумя Labels больше 60 пикселей и все Labels можно найти по адресу X=20 и, по крайней мере, 10 pixels высокий .. Изменить в соответствии с вашими номерами!

Вы можете вызвать функцию всякий раз, когда вам нужно ..:

private void panel1_Scroll(object sender, ScrollEventArgs e) 
{ 
    Control ctl = getTopLabel(panel1); 
    if (ctl != null) Text = ctl.Name; 
} 
+0

Большое спасибо TaW –

+0

Оу! TaW этот код в порядке только для прокрутки, но когда я нажимаю вверх или вниз, он не работает –

+0

Что такое «Вверх» и «Вниз»? Кроме того: вы можете легко трансформировать его в функцию и называть ее всякий раз, когда захотите. – TaW