Adding a select all shortcut (Ctrl + A) to a .net listview?

前端 未结 5 486
野趣味
野趣味 2020-12-11 01:09

Like the subject says I have a listview, and I wanted to add the Ctrl + A select all shortcut to it. My first problem is that I can\'t figure out how

相关标签:
5条回答
  • 2020-12-11 01:21

    These works for small lists, but if there are 100,000 items in a virtual list, this could take a long time. This is probably overkill for your purposes, but just in case::

    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);
    
        /// <summary>
        /// Select all rows on the given listview
        /// </summary>
        /// <param name="list">The listview whose items are to be selected</param>
        public static void SelectAllItems(ListView list) {
            NativeMethods.SetItemState(list, -1, 2, 2);
        }
    
        /// <summary>
        /// Deselect all rows on the given listview
        /// </summary>
        /// <param name="list">The listview whose items are to be deselected</param>
        public static void DeselectAllItems(ListView list) {
            NativeMethods.SetItemState(list, -1, 2, 0);
        }
    
        /// <summary>
        /// Set the item state on the given item
        /// </summary>
        /// <param name="list">The listview whose item's state is to be changed</param>
        /// <param name="itemIndex">The index of the item to be changed</param>
        /// <param name="mask">Which bits of the value are to be set?</param>
        /// <param name="value">The value to be set</param>
        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);
        }
    }
    

    and you use it like this::

    NativeMethods.SelectAllItems(this.myListView);
    
    0 讨论(0)
  • 2020-12-11 01:30
    private void listView1_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyData == (Keys.A | Keys.Control))
            foreach (ListViewItem item in listView1.Items)
                item.Selected = true;
    }
    

    To only do it on Ctrl+A, not on other combinations like Ctrl+Shift+A etc.

    0 讨论(0)
  • 2020-12-11 01:39

    You could accomplish both with something like this:

    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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-11 01:39

    The first solution won't work if user releases the Ctrl key first.

    You should use the KeyDown event instead:

    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;
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-11 01:46

    I could not comment on the first question, however solution with KeyDown does not work for me, because system immediately reacts on LeftCtrl pressed and so skips CTRL+A. From other side KeyUp works correctly.

    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;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题