2016-09-06 4 views
-3

こんにちは私は質問があります。 Panelには、たとえば、Windowsフォームアプリケーションで各ラベルの高さが可変で、パネルを垂直にスクロールするときにパネルに表示される最初のラベルの位置を見つける1000 Labelコントロールが含まれています。ここでスクロール中に自動スクロールパネルの最初の可視ラベルを見つける方法

は私PanelLabelコントロールのスクリーンショットです:

enter image description here

答えて

3

あなたは関係なく、自分のサイズと距離のこの方法をコンテナPanelのトップLabelコントロールを見つけることができます上記のコードでは、最初にTopに基づいてラベルの注文を行い、その後、そのバインディングがコンテナパネルと交差する最初のラベルを取得しました。

トップアイテムの位置を見つけるには、見つけたらtop.Locationを使用してください。

enter image description here

1

あなたはLabelControlsコレクションのループを見つけることができるまで:

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ピクセルより大きく、すべてLabelsX=20で、少なくとも10 pixelsの高さです。あなたの数字に合わせて変更してください!

必要にいつでもあなたが関数を呼び出すことができます..:

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 panel1_Scroll(object sender, ScrollEventArgs e) 
{ 
    Control ctl = getTopLabel(panel1); 
    if (ctl != null) Text = ctl.Name; 
} 
+0

おかげでたくさんTAW –

+0

おお!このコードはスクロールのためにのみOKですが、クリックすると上下にクリックすると機能しません。 –

+0

「上」と「下」とは何ですか?また、関数に変換していつでも呼び出すことができます。 – TaW

関連する問題