如何使用垂直滚动条控制两个列表框?

时间:2012-01-19 18:18:02

标签: c# winforms .net-2.0

我有一个Windows窗体,里面有6个列表框。

我正在尝试查找/创建一个可以让它们一起滚动的代码。所以我在表格上放了一个垂直滚动条,然后输入以下代码:

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)。我是以错误的方式来做这件事的吗?有没有其他方法可以实现我想要的?也许,我首先需要一种方法吗?

非常感谢所有回答的人。

2 个答案:

答案 0 :(得分:2)

将SelectedIndex更改为TopIndex。我刚试过这个并且它有效。

要在更新时保持UI同步,您可以使用Control.BeginUpdate和Control.EndUpdate

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

答案 1 :(得分: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; }
    }
  }
}