none
如何取得ListView滚动条当前位置? RRS feed

  • 问题

  • 使用ListView展示数据内容,由于数据量大,我采用的方法是一部分 一部分加载。

    但现在问题是,将数据加载到ListView后,我无法获知用户已阅读多少内容,我查询过MSDN相关文档,似乎没有一个事件、方法、属性,可以获得ListView的滚动条相关信息(我主要是需要位置信息)。

    有什么办法可以取得ListView当前滚动条的位置属性?(比如已经滑动到90%左右的位置,通过任意方法让我知道)

    最好能够不通过Win32 API,我不希望有本地化的代码。

    2015年5月22日 3:15

答案

  • 你好:

    请尝试一下pinvoke.net上的C#代码示例:

    http://www.pinvoke.net/default.aspx/user32.getscrollinfo

    http://www.pinvoke.net/default.aspx/Structures/SCROLLINFO.html

    C# Sample Code:
    
    // Returns the width of a UserControl containing a RichTextBox
     //  such that no horizontal scrollbar will be needed
     public int PreferredWidth 
     { 
         get
         {
           int MINWIDTH = 200;
           int BORDERWIDTH = SystemInformation.Border3DSize.Width;
           int SCROLLBARWIDTH = SystemInformation.VerticalScrollBarWidth;
    
           SCROLLINFO si = new SCROLLINFO();
           si.cbSize = Marshal.SizeOf( si );
           si.fMask = (int) ScrollInfoMask.SIF_RANGE;
           GetScrollInfo( RichTextBox1.Handle, (int) ScrollBarDirection.SB_HORZ, ref si );
    
           int iWidth = si.nMax - si.nMin + 2 * BORDERWIDTH + SCROLLBARWIDTH + 2;    
           return Math.Max( MINWIDTH, iWidth );
         } 
     }
    
    


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年5月26日 8:06
    版主
  •   不用 API 的话,还真不好整。 

    给你说个我觉的可行的办法: 

    在ListView 外面套个Panel  (因为Panel的滑动条可以获取或设置位置)。

    用Panel的滑动条 来代替ListView的滑动条。

    大概就这个思路,你自己琢磨一哈。

    2015年5月27日 11:15

全部回复

  • NET中没有直接的方法可以获取滚动条的相关信息或数据。

    你可以使用Windows API函数GetScrollPos

    以下为该函数参考资料:

    https://msdn.microsoft.com/zh-cn/library/windows/desktop/bb787585(v=vs.85).aspx

    以下为使用示例

    http://blog.csdn.net/ggw128/article/details/6751114

    • 已编辑 Carefree XT 2015年5月22日 5:29 补充
    • 已标记为答案 4-Dream 2015年5月23日 0:48
    • 取消答案标记 4-Dream 2015年5月23日 7:48
    2015年5月22日 5:26
  • 既然只有API一条路走,我选择了GetScrollInfo函数,根据MSDN也不推荐使用GetScrollPos。

    不过在.net环境下,对于GetScrollInfo函数的第三个参数lpsi,我无法进行初始化。

                const int SB_VERT = 1;
                const int SIF_POS = 4;
                const int SIF_RANGE = 1;
    
            class SCROLLINFO
            {
                public uint cbSize;
                public uint fMask;
                public int nMin;
                public int nMax;
                public uint nPage;
                public int nPos;
                public int nTrackPos;
            }

    我尝试一下两种方法初始化

                SCROLLINFO info = new SCROLLINFO();
                info.cbSize = (uint)Marshal.SizeOf(typeof(SCROLLINFO));
                info.fMask = SIF_POS | SIF_RANGE;
    
                if (GetScrollInfo(this.lvList.Handle, SB_VERT, ref info) != 0)

    类型“SCROLLINFO”不能作为非托管结构进行封送处理;无法计算有意义的大小或偏移量。

    info.cbSize = (uint)sizeof(SCROLLINFO);

    无法获取托管类型(“SCROLLINFO”)的地址和大小,或无法声明指向它的指针

    第二种是无法编译通过的。


    那么在托管代码里,我应该如何正确的填充cbSize这个参数呢?



    • 已编辑 4-Dream 2015年5月23日 7:49
    2015年5月23日 7:48
  • 你好:

    请尝试一下pinvoke.net上的C#代码示例:

    http://www.pinvoke.net/default.aspx/user32.getscrollinfo

    http://www.pinvoke.net/default.aspx/Structures/SCROLLINFO.html

    C# Sample Code:
    
    // Returns the width of a UserControl containing a RichTextBox
     //  such that no horizontal scrollbar will be needed
     public int PreferredWidth 
     { 
         get
         {
           int MINWIDTH = 200;
           int BORDERWIDTH = SystemInformation.Border3DSize.Width;
           int SCROLLBARWIDTH = SystemInformation.VerticalScrollBarWidth;
    
           SCROLLINFO si = new SCROLLINFO();
           si.cbSize = Marshal.SizeOf( si );
           si.fMask = (int) ScrollInfoMask.SIF_RANGE;
           GetScrollInfo( RichTextBox1.Handle, (int) ScrollBarDirection.SB_HORZ, ref si );
    
           int iWidth = si.nMax - si.nMin + 2 * BORDERWIDTH + SCROLLBARWIDTH + 2;    
           return Math.Max( MINWIDTH, iWidth );
         } 
     }
    
    


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2015年5月26日 8:06
    版主
  •   不用 API 的话,还真不好整。 

    给你说个我觉的可行的办法: 

    在ListView 外面套个Panel  (因为Panel的滑动条可以获取或设置位置)。

    用Panel的滑动条 来代替ListView的滑动条。

    大概就这个思路,你自己琢磨一哈。

    2015年5月27日 11:15