[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
private void button1_Click(object sender, EventArgs e)
{
Stopwatch sw = new Stopwatch();
sw.Start();
IntPtr h = this.listView1.Handle;
int j = 0;
int i = SendMessage(h, 0x100C, -1, 2);
while (i > -1) {
j++;
i = SendMessage(h, 0x100C, i, 2);
}
sw.Stop();
this.toolStripStatusLabel1.Text = String.Format("Timed: {0} items in {1}ms",
j, sw.ElapsedMilliseconds);
}
4条答案
按热度按时间58wvjzkj1#
WinForms ListView的一个问题是,它是建立在Win32Control之上的,因此对ListView的每个请求都必须从托管代码传递到无人代码,然后再传递回来。
可能会快一些,值得一试
否则,您是否考虑过使用WPF?您可以为列表编写单个WPF控件,然后将其托管在WinForm窗体中。
sshcrbum2#
这取决于你是如何做的,你可能想用一些代码来详细说明,但是你不能在选择每个项目时保持一个运行的总数,而不是每次选择时都要遍历整个列表吗?
mkshixfv3#
底层控件是主要问题,它只是需要一定的时间来检查每一项,并决定它是否是下一个选中的行。
通过直接向控件发送消息,可以使枚举过程的速度提高一倍左右:
在我的机器上,这将迭代所选项目所需的时间减半,但这个过程永远不会是即时的。
vbopmzt14#
在我的具体情况下,性能得到了很大的改善,从
到
希望这能帮助到别人。