2009-06-19 36 views
18

Giống như chủ đề nói rằng tôi có một listview, và tôi muốn thêm Ctrl + A chọn tất cả phím tắt cho nó. Vấn đề đầu tiên của tôi là tôi không thể tìm ra cách lập trình chọn tất cả các mục trong một listview. Dường như nó tương đối dễ, như ListView.SelectAll() hoặc ListView.Items.SelectAll(), nhưng dường như không phải như vậy. Vấn đề tiếp theo của tôi là cách xác định lối tắt bàn phím cho ListView. Tôi có làm điều đó trong sự kiện KeyUp không, nhưng sau đó bạn sẽ kiểm tra hai lần nhấn cùng một lúc như thế nào? Hoặc nó là một tài sản mà bạn thiết lập?Thêm một phím tắt chọn tất cả (Ctrl + A) vào danh sách .net?

Mọi trợ giúp ở đây sẽ tuyệt vời.

Trả lời

30

Bạn có thể đạt được cả hai với một cái gì đó như thế này:

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

Bạn có một HAY trong câu lệnh if của bạn - nên AND. –

+0

Đã sửa lỗi - Tôi vừa thấy điều đó. :) –

+0

Ha, tôi biết nó sẽ là một cái gì đó ridiculously dễ dàng. Cảm ơn. – ryanulit

21

Những tác phẩm cho các danh sách nhỏ, nhưng nếu có 100.000 thư mục trong một danh sách ảo, điều này có thể mất một thời gian dài. Đây có lẽ là quá mức cần thiết cho mục đích của bạn, nhưng chỉ trong trường hợp ::

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

và bạn sử dụng nó như thế này ::

NativeMethods.SelectAllItems(this.myListView); 
+0

Có bất kỳ điều kiện tiên quyết nào để chạy mã này không? Tôi đang thử nó trên một ListView NET thường xuyên với CheckBoxes = true. Và nó không làm gì cả. –

+0

bạn có thể cung cấp phiên bản vb.net – Smith

+0

Cảm ơn rất nhiều, công trình này tuyệt vời! Tôi sử dụng một listview trong chế độ ảo. Nhưng bằng cách nào đó số lượng mặt hàng dường như bị hạn chế. Bạn có chắc chắn 100.000 hàng có thể không? – brighty

3

Các giải pháp đầu tiên sẽ không hoạt động nếu người dùng nhả Ctrl trước tiên.

Bạn nên sử dụng các sự kiện KeyDown thay vì:

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

Tôi không thể đăng nhận xét về câu trả lời đầu tiên nên tôi đã đăng câu trả lời mới (xin lỗi về điều đó) – olorin

+0

Điều này dường như không khác với câu trả lời đầu tiên (ngoại trừ thứ tự chcks trong câu lệnh if). Tui bỏ lỡ điều gì vậy? –

+0

Câu trả lời khác ban đầu được sử dụng 'KeyUp' và đã được chỉnh sửa. – JYelton

0

Tôi không thể bình luận về câu hỏi đầu tiên, tuy nhiên giải pháp với KeyDown không làm việc cho tôi, bởi vì hệ thống ngay lập tức phản ứng trên LeftCtrl ép và do đó bỏ qua tổ hợp phím CTRL + A. Từ phía bên kia KeyUp hoạt động chính xác.

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; 
     } 
    } 
} 
5
private void listView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyData == (Keys.A | Keys.Control)) 
     foreach (ListViewItem item in listView1.Items) 
      item.Selected = true; 
} 

Để chỉ làm điều đó trên Ctrl + A, không phải trên các kết hợp khác như tổ hợp phím Ctrl + Shift + A vv

+1

+1 cho điểm "Để chỉ làm điều đó trên Ctrl + A", giải pháp của Grammarian là tốt hơn cho hiệu suất mặc dù – yclkvnc

Các vấn đề liên quan