2009-06-19 9 views
18

विषय की तरह कहते हैं कि मेरे पास एक सूचीदृश्य है, और मैं Ctrl + इसमें सभी शॉर्टकट का चयन करना चाहता था। मेरी पहली समस्या यह है कि मैं यह नहीं समझ सकता कि प्रोग्रामव्यू में सूची आइटम में सभी आइटमों का चयन कैसे करें। ऐसा लगता है कि यह अपेक्षाकृत आसान होना चाहिए, जैसे ListView.SelectAll() या ListView.Items.SelectAll(), लेकिन ऐसा लगता है कि यह मामला नहीं है। मेरी अगली समस्या ListView के लिए कीबोर्ड शॉर्टकट को परिभाषित करने का तरीका है। क्या मैं इसे KeyUp ईवेंट में करता हूं, लेकिन फिर आप एक बार में दो प्रेस कैसे जांचेंगे? या यह एक संपत्ति है जिसे आपने सेट किया है?एक .net सूचीदृश्य में सभी शॉर्टकट (Ctrl + A) का चयन करें?

यहां कोई भी मदद महान होगी।

उत्तर

30

आप दोनों कुछ इस तरह से पूरा कर सकते हैं:

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

फिक्स्ड - मैंने अभी देखा है। :) –

+0

हा, मुझे पता था कि यह कुछ हास्यास्पद रूप से आसान होने वाला था। धन्यवाद। – ryanulit

21

छोटे सूचियों के लिए इन कार्यों, लेकिन अगर वहाँ एक आभासी सूची में 100,000 आइटम हैं, यह एक लंबा समय लग सकता है। यह शायद अपने उद्देश्यों के लिए overkill है, लेकिन सिर्फ मामले ::

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); 
+0

क्या इस कोड को चलाने के लिए कोई और आवश्यकता है? मैं इसे नियमित रूप से .NET ListView पर CheckBoxes = true के साथ आज़मा रहा हूं। और यह कुछ भी नहीं कर रहा है। –

+0

क्या आप vb.net संस्करण – Smith

+0

प्रदान कर सकते हैं बहुत धन्यवाद, यह बहुत अच्छा काम करता है! मैं आभासी मोड में एक सूचीदृश्य का उपयोग करें। लेकिन किसी भी तरह की वस्तुओं की संख्या सीमित लगती है। क्या आप निश्चित हैं कि 100,000 पंक्तियां संभव हैं? – brighty

3

पहला समाधान उपयोगकर्ता 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

मैं पहले उत्तर पर कोई टिप्पणी पोस्ट करने में सक्षम नहीं था इसलिए मैंने एक नया उत्तर पोस्ट किया (इसके बारे में खेद है) – olorin

+0

यह पहले उत्तर से अलग नहीं लगता है (अगर कथन में चक के क्रम को छोड़कर)। क्या मैं कुछ भूल रहा हूँ? –

+0

मूल रूप से 'कुंजीअप' का उपयोग किया गया और संपादित किया गया था। – JYelton

0

मैं पहला सवाल पर कोई टिप्पणी नहीं कर सकता है, हालांकि KeyDown साथ समाधान मेरे लिए काम नहीं करता, क्योंकि सिस्टम तुरंत LeftCtrl पर दबाया प्रतिक्रिया करता है और इसलिए छोड़ देता है तो Ctrl + ए। दूसरी ओर से 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; 
     } 
    } 
} 
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; 
} 

करने के लिए केवल, पर Ctrl + A यह कर की तरह अन्य संयोजन पर नहीं Ctrl + Shift + A आदि

+1

बिंदु के लिए +1 "इसे केवल Ctrl + A पर करने के लिए", ग्रामरियन का समाधान प्रदर्शन के लिए बेहतर है हालांकि – yclkvnc