2012-01-19 2 views
0

6 개의 목록 상자가있는 Windows Form이 있습니다.세로 스크롤 막대를 사용하여 두 개의 목록 상자를 제어하는 ​​방법은 무엇입니까?

나는 함께 스크롤 할 수있는 코드를 찾고/만들려고합니다. 그래서 나는 다음 코드에 넣어 형태 위에 수직 스크롤 막대를 떨어 :

private void vScrollR_Scroll(object sender, ScrollEventArgs e) 
{ 
    int i = vScrollR.Value; 
    lstcr1.SelectedIndex = i; 
    lstpr1.SelectedIndex = i; 
    lstsr1.SelectedIndex = i; 
    lstcr2.SelectedIndex = i; 
    lstpr2.SelectedIndex = i; 
    lstsr2.SelectedIndex = i; 
} 

을 어떤 이유로하지만, 그것은 작동하지 않습니다 (내가 항상 0을 반환). 내가 잘못된 방향으로가는거야? 내가 원하는 것을 성취 할 수있는 다른 방법이 있습니까? 아마 내가 먼저해야 할 방법이 있을까요?

답장을 보내준 모든 사람들에게 많은 감사를드립니다.

+0

당신이 처리 할 대리자를 만드는 방법에 대해 생각 사용할 수 있습니다 ..? – MethodMan

답변

2

SelectedIndex를 TopIndex로 변경하십시오. 방금 시도했는데 제대로 작동합니다. 업데이트하는 동안

UI의 동기화를 유지하려면 Control.BeginUpdate 및 Control.EndUpdate

 listBox1.BeginUpdate(); 
     listBox2.BeginUpdate(); 
     listBox1.TopIndex = 
     listBox2.TopIndex = ++x; 
     listBox1.EndUpdate(); 
     listBox2.EndUpdate(); 
+0

그게 효과가있다. 그래도 질문. 그들은 동시에 스크롤하지 않습니다. 결국 같은 항목에서 끝나지 만 일부 목록 상자가 지연됩니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까? –

+0

UI 지연에 대한 질문에 답변하기 위해 답변을 업데이트했습니다. 당신이 행복하다면 그 질문에 답을 표시하도록하십시오. –

1

목록 상자에서 상속하는 별도의 클래스를 만들어보십시오.

이 정보가 도움이되기를 바랍니다.

using System; 
using System.Windows.Forms; 

public class myScrollingListBox : ListBox 
{ 
    // Event declaration 
    public delegate void myScrollingListBoxDelegate(object Sender, myScrollingListBoxScrollArgs e); 
    public event myScrollingListBoxDelegate Scroll; 
    // WM_VSCROLL message constants 
    private const int WM_VSCROLL = 0x0115; 
    private const int SB_THUMBTRACK = 5; 
    private const int SB_ENDSCROLL = 8; 

    protected override void WndProc(ref Message m) 
    { 
    // Trap the WM_VSCROLL message to generate the Scroll event 
    base.WndProc(ref m); 
    if (m.Msg == WM_VSCROLL) 
    { 
     int nfy = m.WParam.ToInt32() & 0xFFFF; 
     if (Scroll != null && (nfy == SB_THUMBTRACK || nfy == SB_ENDSCROLL)) 
     Scroll(this, new myScrollingListBoxScrollArgs(this.TopIndex, nfy == SB_THUMBTRACK)); 
    } 
    } 
    public class myScrollingListBoxScrollArgs 
    { 
    // Scroll event argument 
    private int mTop; 
    private bool mTracking; 
    public myScrollingListBoxScrollArgs(int top, bool tracking) 
    { 
     mTop = top; 
     mTracking = tracking; 
    } 
    public int Top 
    { 
     get { return mTop; } 
    } 
    public bool Tracking 
    { 
     get { return mTracking; } 
    } 
    } 
} 
관련 문제