21 Stimmen

Hinzufügen einer "Alles auswählen"-Verknüpfung (Strg + A) zu einer .net-Listenansicht?

Wie das Thema sagt, habe ich eine Listenansicht, und ich wollte die Ctrl + A alles auswählen, was mit ihm verknüpft ist. Mein erstes Problem ist, dass ich nicht herausfinden kann, wie ich programmatisch alle Elemente in einer Listenansicht auswählen kann. Es scheint, wie es relativ einfach sein sollte, wie ListView.SelectAll() o ListView.Items.SelectAll() aber das scheint nicht der Fall zu sein. Mein nächstes Problem ist, wie ich das Tastaturkürzel für die ListView . Mache ich es in einer KeyUp aber wie würden Sie dann zwei Pressen gleichzeitig überprüfen? Oder ist es eine Eigenschaft, die Sie einstellen?

Jede Hilfe wäre hier sehr hilfreich.

32voto

Shane Fulmer Punkte 7248

Sie könnten beides mit etwas Ähnlichem erreichen:

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

26voto

Grammarian Punkte 6539

Dies funktioniert bei kleinen Listen, aber wenn eine virtuelle Liste 100.000 Einträge enthält, kann dies sehr lange dauern. Das ist wahrscheinlich zu viel für Ihre Zwecke, aber nur für den Fall::

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

und Sie verwenden es so::

NativeMethods.SelectAllItems(this.myListView);

7voto

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

An sólo nur bei Strg+A, nicht bei anderen Kombinationen wie Strg+Umschalt+A usw.

3voto

olorin Punkte 2204

Die erste Lösung wird nicht funktionieren, wenn der Benutzer die Ctrl Taste zuerst.

Sie sollten die KeyDown Ereignis statt:

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

0voto

Vitaliy.Vol Punkte 11

Zur ersten Frage kann ich nichts sagen, aber die Lösung mit KeyDown funktioniert bei mir nicht, da das System sofort auf gedrückte LinkeStrg reagiert und somit STRG+A überspringt. Auf der anderen Seite funktioniert KeyUp korrekt.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X