C# 列表视图选择计时器

C# 列表视图选择计时器,c#,winforms,listview,C#,Winforms,Listview,我使用以下方法选择ListView中的所有项目: private void listView_KeyDown(object sender, KeyEventArgs e) { if (e.Control && e.KeyCode == Keys.A) { foreach (ListViewItem item in listView.Items) item.Selected = true; e.Handled

我使用以下方法选择ListView中的所有项目:

private void listView_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        foreach (ListViewItem item in listView.Items)
            item.Selected = true;

        e.Handled = true;
    }
}
当我单击一个已选择的项目,然后按Ctrl+A时,它会选择所有项目,但在1秒后,选择将返回到单击的单个项目

解决方案

我找不到ListView启动计时器或更改选择的位置,简单地忽略WM_timer不会停止计时器,因此我们必须手动恢复选择:

public class CustomListView : ListView
{
    private const int WM_TIMER = 0x113;

    protected override void WndProc(ref Message m)
    {
        if (m.Msg != WM_TIMER)
        {
            base.WndProc(ref m);
        }
        else
        {
            var selectionCache = Items.Cast<ListViewItem>().Select(x => x.Selected).ToArray();

            BeginUpdate();

            base.WndProc(ref m);

            for (int i = 0; i < Items.Count; i++)
                Items[i].Selected = selectionCache[i];

            EndUpdate();
        }
    }
}
公共类CustomListView:ListView { 私有常量int WM_计时器=0x113; 受保护的覆盖无效WndProc(参考消息m) { if(m.Msg!=WM_定时器) { 基准WndProc(参考m); } 其他的 { var selectionCache=Items.Cast().Select(x=>x.Selected.ToArray(); 开始更新(); 基准WndProc(参考m); 对于(int i=0;i如果你不按住Ctrl键,只按A怎么办?是的,我想这可能是原因,但如果我在没有修改键的情况下按A,什么也不会发生。我刚刚找到的一个快速解决方案是忽略WndProcI中的WM_定时器。我以前见过这种抱怨,我还没有重新解释。记录您的Windows版本和所选的视图属性。最好是从Designer.cs文件中提取一段代码。我正在运行Windows XP。View属性设置为Details,所有其他属性都是默认值。