Добавление ярлыка выбора всех (Ctrl + A) к списку .net? - PullRequest
19 голосов
/ 19 июня 2009

Как субъект говорит, что у меня есть просмотр списка, и я хотел добавить Ctrl + A , чтобы выбрать все ярлыки к нему. Моя первая проблема заключается в том, что я не могу понять, как программно выбрать все элементы в списке. Кажется, что это должно быть относительно легко, как ListView.SelectAll() или ListView.Items.SelectAll(), но это не так. Моя следующая проблема - как определить сочетание клавиш для ListView. Я делаю это в случае KeyUp, но тогда как бы вы проверили два нажатия одновременно? Или это свойство, которое вы установили?

Любая помощь здесь будет отличной.

Ответы [ 5 ]

31 голосов
/ 19 июня 2009

Вы могли бы выполнить оба с чем-то вроде этого:

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;
        }
    }
}
23 голосов
/ 13 июля 2009

Это работает для небольших списков, но если в виртуальном списке 100 000 элементов, это может занять много времени. Это, вероятно, излишне для ваших целей, но на всякий случай ::

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);
    }
}

и вы используете это так:

NativeMethods.SelectAllItems(this.myListView);
5 голосов
/ 22 августа 2013
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyData == (Keys.A | Keys.Control))
        foreach (ListViewItem item in listView1.Items)
            item.Selected = true;
}

Для только сделать это с помощью Ctrl + A, а не с другими комбинациями, такими как Ctrl + Shift + A и т. Д.

3 голосов
/ 15 декабря 2009

Первое решение не будет работать, если пользователь сначала отпустит клавишу Ctrl .

Вместо этого следует использовать событие KeyDown:

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 голосов
/ 06 июля 2013

Я не могу прокомментировать первый вопрос, однако решение с KeyDown у меня не работает, потому что система немедленно реагирует на нажатие LeftCtrl и пропускает CTRL + A. С другой стороны KeyUp работает правильно.

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;
        }
    }
}
...