Adicionando um atalho para selecionar todos os atalhos (Ctrl + A) para um listview .net?

Como o sujeito diz que eu tenho um listview, e eu queria adicionar o Ctrl + A selecione todos os atalhos para ele. Meu primeiro problema é que não consigo descobrir como selecionar programaticamente todos os itens em um listview. Parece que deve ser relativamente fácil, como ListView.SelectAll() ou ListView.Items.SelectAll() , mas isso não parece ser o caso. Meu próximo problema é como definir o atalho de teclado para o ListView . Eu faço isso em um evento KeyUp , mas como você verifica duas impressoras de uma só vez? Ou é uma propriedade que você define?

Qualquer ajuda aqui seria ótima.

Você poderia realizar as duas coisas com algo assim:

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

Isso funciona para listas pequenas, mas se houver 100.000 itens em uma lista virtual, isso pode levar muito tempo. Este é provavelmente um exagero para seus propósitos, mas apenas no caso:

 class NativeMethods { private const int LVM_FIRST = 0x1000; private const int LVM_SETITEMSTATE = LVM_FIRST + 43; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct LVITEM { public int mask; public int iItem; public int iSubItem; public int state; public int stateMask; [MarshalAs(UnmanagedType.LPTStr)] public string pszText; public int cchTextMax; public int iImage; public IntPtr lParam; public int iIndent; public int iGroupId; public int cColumns; public IntPtr puColumns; }; [DllImport("user32.dll", EntryPoint = "SendMessage", CharSet = CharSet.Auto)] public static extern IntPtr SendMessageLVItem(IntPtr hWnd, int msg, int wParam, ref LVITEM lvi); ///  /// Select all rows on the given listview ///  /// The listview whose items are to be selected public static void SelectAllItems(ListView list) { NativeMethods.SetItemState(list, -1, 2, 2); } ///  /// Deselect all rows on the given listview ///  /// The listview whose items are to be deselected public static void DeselectAllItems(ListView list) { NativeMethods.SetItemState(list, -1, 2, 0); } ///  /// Set the item state on the given item ///  /// The listview whose item's state is to be changed /// The index of the item to be changed /// Which bits of the value are to be set? /// The value to be set public static void SetItemState(ListView list, int itemIndex, int mask, int value) { LVITEM lvItem = new LVITEM(); lvItem.stateMask = mask; lvItem.state = value; SendMessageLVItem(list.Handle, LVM_SETITEMSTATE, itemIndex, ref lvItem); } } 

e você usa assim ::

 NativeMethods.SelectAllItems(this.myListView); 
 private void listView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == (Keys.A | Keys.Control)) foreach (ListViewItem item in listView1.Items) item.Selected = true; } 

Para fazer isso apenas no Ctrl + A, não em outras combinações como Ctrl + Shift + A etc.

A primeira solução não funcionará se o usuário liberar a tecla Ctrl primeiro.

Você deve usar o evento KeyDown vez disso:

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

Eu não poderia comentar sobre a primeira questão, no entanto solução com KeyDown não funciona para mim, porque o sistema reage imediatamente em LeftCtrl pressionado e assim pula CTRL + A. Do outro lado, o KeyUp funciona corretamente.

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