Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

EnsureVisible for ListViewSubItem

0.00/5 (No votes)
30 Sep 2008 1  
Scroll horizontally in a ListView to ensure visibility of a subitem

Introduction 

It extends the ListView control and adds an EnsureVisible method to scroll horizontally to a subitem.

Background   

I often use The Code Project to find good samples, but I didn't find one for this. So I just want to give something back.    

Using the Code 

The native Windows message to scroll the listview is:

        const Int32 LVM_FIRST = 0x1000;
        const Int32 LVM_SCROLL = LVM_FIRST + 20;

        [DllImport("user32")]
        static extern IntPtr SendMessage(IntPtr Handle, Int32 msg, IntPtr wParam,
        IntPtr lParam);

        private void ScrollHorizontal(int pixelsToScroll)
        {
            SendMessage(this.Handle, LVM_SCROLL, (IntPtr)pixelsToScroll,
            IntPtr.Zero);
        }   

The public method to call with item to scroll to is as follows:

        /// <summary>
        /// Ensure visible of a ListViewItem and SubItem Index.
        /// </summary>
        /// <param name="item"></param>
        /// <param name="subItemIndex"></param>
        public void EnsureVisible(ListViewItem item, int subItemIndex)
        {
            if (item == null || subItemIndex > item.SubItems.Count - 1)
            {
                throw new ArgumentException();
            }

            // scroll to the item row.
            item.EnsureVisible();
            Rectangle bounds = item.SubItems[subItemIndex].Bounds;

            // need to set width from columnheader, first subitem includes
            // all subitems.
            bounds.Width = this.Columns[subItemIndex].Width;

            ScrollToRectangle(bounds);
        }

        /// <summary>
        /// Scrolls the listview.
        /// </summary>
        /// <param name="bounds"></param>
        private void ScrollToRectangle(Rectangle bounds)
        {
            int scrollToLeft = bounds.X + bounds.Width + MARGIN;
            if (scrollToLeft > this.Bounds.Width)
            {
                this.ScrollHorizontal(scrollToLeft - this.Bounds.Width);
            }
            else
            {
                int scrollToRight = bounds.X - MARGIN;
                if (scrollToRight < 0)
                {
                    this.ScrollHorizontal(scrollToRight);
                }
            }
        }
    }

History

  • 30th September, 2008: Initial post

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here