C# 列表视图选择计时器
我使用以下方法选择ListView中的所有项目: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
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