Jus*_*tin 2 .net c# listview scroll winforms
我在详细信息视图中使用ListView控件并VirtualMode设置为true,我发现无论何时添加新项目,horozontal滚动条都设置为最左侧位置.如果ListView不在虚拟模式下,则不会发生这种情况.更新:如果您不启用视觉样式,也不会发生这种情况.
您可以通过ListView在详细信息模式下创建一个包含2列的简单并添加如下内容来查看:
Timer timer = new Timer();
public Form1()
{
this.InitializeComponent();
this.listView1.VirtualMode = true;
this.listView1.RetrieveVirtualItem += new RetrieveVirtualItemEventHandler(listView1_RetrieveVirtualItem);
this.listView1.VirtualListSize = 10;
timer.Interval = 250;
timer.Tick += new EventHandler(t_Tick);
timer.Start();
}
void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e)
{
e.Item = new ListViewItem(new string[] {"Test", ""});
}
void t_Tick(object sender, EventArgs e)
{
this.listView1.VirtualListSize += 1;
}
Run Code Online (Sandbox Code Playgroud)
向右滚动列表视图以查看此效果.
我怎么能阻止这种情况发生?我有一个应用程序,其中项目不断添加到列表视图中,因此这种行为非常分散注意力.
这似乎是一个已知错误:虚拟模式下的ListView滚动不正确
微软对Connect报告的最后评论是:
这是底层Win32控件的问题.我们无法解决这个问题,操作系统团队需要解决这个问题.
当然那是在2005年,所以也许它在Win 8中被修复了?
与此同时,解决方法似乎是:
创建继承ListView的新类并编写以下代码:
private static FieldInfo _internalVirtualListSizeField;
static FlickerFreeListView()
{
_internalVirtualListSizeField = typeof(ListView).GetField("virtualListSize", System.Reflection.BindingFlags.NonPublic | BindingFlags.Instance);
}
[DllImport("user32.dll", CharSet = CharSet.Auto)]
private static extern IntPtr SendMessage(HandleRef hWnd, int msg, int wParam, int lParam);
private IntPtr SendMessage(int msg, int wparam, int lparam)
{
return SendMessage(new HandleRef(this, this.Handle), msg, wparam, lparam);
}
public void SetVirtualListSize(int size)
{
if (size < 0)
{
throw new ArgumentException("ListViewVirtualListSizeInvalidArgument");
}
_internalVirtualListSizeField.SetValue(this, size);
if ((base.IsHandleCreated && this.VirtualMode) && !base.DesignMode)
{
SendMessage(0x102f, size, 2);
}
}
Run Code Online (Sandbox Code Playgroud)
现在更新代码以使用SetVirtualListSize方法而不是原始的VirtualListSize属性.
0x102f = LVM_SETITEMCOUNT
2 = LVSICF_NOSCROLL
Run Code Online (Sandbox Code Playgroud)
参考:http: //msdn.microsoft.com/en-us/library/bb761188%28VS.85%29.aspx