Click here to Skip to main content
13,194,103 members (49,013 online)
Click here to Skip to main content
Add your own
alternative version

Tagged as


8 bookmarked
Posted 16 May 2011

Synchronized ListBox objects (or how to scroll 2 ListBox objects together)

, 16 May 2011
Rate this:
Please Sign up or sign in to vote.
In this tip I will show, how to scroll two listbox objects together
Before couple of days I had a task where I must synchronize two ListBox objects. I have fount out, that ListBox object doesn't have any property which allow to accomplish this. After a few hours of googling I found code of class that inherited from ListBox class. Here is the code of that class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using System.Runtime.InteropServices;
namespace SyncLists
    class SyncListBox : System.Windows.Forms.ListBox
        private const int WM_HSCROLL = 0x114;
        private const int WM_VSCROLL = 0x115;
        public event ScrollEventHandler OnHorizontalScroll;
        public event ScrollEventHandler OnVerticalScroll;
        private const int SB_LINEUP = 0;
        private const int SB_LINELEFT = 0;
        private const int SB_LINEDOWN = 1;
        private const int SB_LINERIGHT = 1;
        private const int SB_PAGEUP = 2;
        private const int SB_PAGELEFT = 2;
        private const int SB_PAGEDOWN = 3;
        private const int SB_PAGERIGHT = 3;
        private const int SB_THUMBPOSITION = 4;
        private const int SB_THUMBTRACK = 5;
        private const int SB_PAGETOP = 6;
        private const int SB_LEFT = 6;
        private const int SB_PAGEBOTTOM = 7;
        private const int SB_RIGHT = 7;
        private const int SB_ENDSCROLL = 8;
        private const int SIF_TRACKPOS = 0x10;
        private const int SIF_RANGE = 0x1;
        private const int SIF_POS = 0x4;
        private const int SIF_PAGE = 0x2;
        private const int SIF_ALL = SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS;
        [DllImport("user32.dll", SetLastError = true)]
        private static extern int GetScrollInfo(
        IntPtr hWnd, int n, ref ScrollInfoStruct lpScrollInfo);
        private struct ScrollInfoStruct
            public int cbSize;
            public int fMask;
            public int nMin;
            public int nMax;
            public int nPage;
            public int nPos;
            public int nTrackPos;
        protected override void WndProc(ref System.Windows.Forms.Message msg)
            if (msg.Msg == WM_HSCROLL)
                if (OnHorizontalScroll != null)
                    ScrollInfoStruct si = new ScrollInfoStruct();
                    si.fMask = SIF_ALL;
                    si.cbSize = Marshal.SizeOf(si);
                    GetScrollInfo(msg.HWnd, 0, ref si);
                    if (msg.WParam.ToInt32() == SB_ENDSCROLL)
                        ScrollEventArgs sargs = new ScrollEventArgs(
                        OnHorizontalScroll(this, sargs);
            if (msg.Msg == WM_VSCROLL)
                if (OnVerticalScroll != null)
                    ScrollInfoStruct si = new ScrollInfoStruct();
                    si.fMask = SIF_ALL;
                    si.cbSize = Marshal.SizeOf(si);
                    GetScrollInfo(msg.HWnd, 0, ref si);
                    if (msg.WParam.ToInt32() == SB_ENDSCROLL)
                        ScrollEventArgs sargs = new ScrollEventArgs(
                        OnVerticalScroll(this, sargs);
            base.WndProc(ref msg);
        private void InitializeComponent()
            // scrolled
            this.Size = new System.Drawing.Size(120, 95);

add two SyncListBox objects (syncListView1 and syncListView2) on the form and add following code:
private void syncListView2_OnVerticalScroll(object sender, ScrollEventArgs e)
    syncListView1.TopIndex = syncListView2.TopIndex;
private void syncListView1_OnVerticalScroll(object sender, ScrollEventArgs e)
    syncListView2.TopIndex = syncListView1.TopIndex;


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Kanasz Robert
Architect The Staffing Edge & Marwin Cassovia Soft
Slovakia Slovakia
My name is Robert Kanasz and I have been working with ASP.NET, WinForms and C# for several years.
MCSD - Web Applications
MCSE - Data Platform
MCPD - ASP.NET Developer 3.5
- Web Developer 4
MCITP - Database Administrator 2008
- Database Developer 2008
MCSA - SQL Server 2012
MCTS - .NET Framework 3.5, ASP.NET Applications
- SQL Server 2008, Database Development
- SQL Server 2008, Implementation and Maintenance
- .NET Framework 4, Data Access
- .NET Framework 4, Service Communication Applications
- .NET Framework 4, Web Applications
MS - Programming in HTML5 with JavaScript and CSS3 Specialist

Open source projects: DBScripter - Library for scripting SQL Server database objects

Please, do not forget vote

You may also be interested in...


Comments and Discussions

QuestionLines for Designer event! Pin
Member 117520908-Jun-15 21:42
memberMember 117520908-Jun-15 21:42 
QuestionTo get this to work... Pin
Member 996007922-May-13 10:38
memberMember 996007922-May-13 10:38 
I had to add the event handlers like so:

this.syncListBox1.OnVerticalScroll += this.syncListBox1_OnVerticalScroll;

Note that although this works, the scroll isn't smooth. The second listbox's scroll position lags behind the index of the listbox that's being scrolled.
QuestionConversion into VB Pin
Member 847453326-Sep-12 4:53
memberMember 847453326-Sep-12 4:53 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.171018.2 | Last Updated 17 May 2011
Article Copyright 2011 by Kanasz Robert
Everything else Copyright © CodeProject, 1999-2017
Layout: fixed | fluid