Обнаружение, когда полоса прокрутки ListView достигает дна в WinForms - PullRequest
4 голосов
/ 16 мая 2011

Как узнать, когда полоса прокрутки WinForms ListView достигает своего дна? Когда это происходит, я хочу, чтобы представление списка было заполнено большим количеством данных (что в моем случае бесконечно в моем случае).

Событие OnScroll дает мне значение прокрутки сверху, но я не знаю, может ли пользователь прокрутить дальше или нет.

Ответы [ 2 ]

3 голосов
/ 18 мая 2011

Я нашел ответ, используя некоторый код из замечательного проекта кода ObjectListView: http://www.codeproject.com/KB/list/ObjectListView.aspx

вызов GetScrollInfo:

    private const int SIF_RANGE = 0x0001;
    private const int SIF_PAGE = 0x0002;
    private const int SIF_POS = 0x0004;
    private const int SIF_DISABLENOSCROLL = 0x0008;
    private const int SIF_TRACKPOS = 0x0010;
    private const int SIF_ALL = (SIF_RANGE | SIF_PAGE | SIF_POS | SIF_TRACKPOS);        
    private const int SB_HORZ = 0;
    private const int SB_VERT = 1;

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
    public static extern bool GetScrollInfo(IntPtr hWnd, int fnBar, SCROLLINFO scrollInfo);

    public static SCROLLINFO GetFullScrollInfo(ListView lv, bool horizontalBar) {
      int fnBar = (horizontalBar ? SB_HORZ : SB_VERT);

      SCROLLINFO scrollInfo = new SCROLLINFO();
      scrollInfo.fMask = SIF_ALL;
      if (GetScrollInfo(lv.Handle, fnBar, scrollInfo))
        return scrollInfo;
      else
        return null;
    }

с этой структурой данных:

    [StructLayout(LayoutKind.Sequential)]
    public class SCROLLINFO
    {
        public int cbSize = Marshal.SizeOf(typeof(SCROLLINFO));
        public int fMask;
        public int nMin;
        public int nMax;
        public int nPage;
        public int nPos;
        public int nTrackPos;
    }

nMax дает общее максимальное значение прокрутки, включая сам дескриптор прокрутки, поэтому фактически полезным максимальным значением является nMax - nPage, где nPage - размер дескриптора прокрутки.

Это прекрасно работает!

0 голосов
/ 16 мая 2011

Я не могу ответить на ваш вопрос напрямую, но из вашего описания кажется, что вы действительно хотите изучить использование виртуального режима представления списка для управления большим набором данных.

http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.virtualmode.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...