2012-05-19 23 views
5

डिफ़ॉल्ट व्यवहार (बाएं या दाएं बटन CTRL उपयोग करने के लिए + datagrid में आइटम का चयन रद्द करने के लिए क्लिक करेंWPF डेटा ग्रिड - चयनित आइटम (रों) जब डेटा ग्रिड में खाली स्थान के क्लिक करने

मैं माउस क्लिक करने के लिए सक्षम होना चाहते हैं है का चयन रद्द) ग्रिड में व्हाइटस्पेस और इसे किसी भी चयनित आइटम को अचयनित कर दिया है।

मैंने इसे मौत के लिए गुमराह किया है और कुछ अविश्वसनीय रूप से जटिल कामकाज पाए हैं, लेकिन मैं एक साधारण समाधान की उम्मीद कर रहा हूं।

संपादित करें:

मैं अब बजाय सूचीदृश्य उपयोग कर रहा हूँ, और अभी भी एक समाधान पाया नहीं किया। यह एक सूचीदृश्य के साथ थोड़ा कम परेशान है हालांकि वे बेहतर स्टाइल हैं।

उत्तर

3

एक साधारण

<DataGrid MouseDown="DataGrid_MouseDown"> 

आप क्या चाहते हैं नहीं है?

private void DataGrid_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    (sender as DataGrid).SelectedItem = null; 
} 

एकमात्र नुकसान यह है कि किसी चयनित आइटम पर CTRL के बिना एक क्लिक भी सभी को अचयनित करता है।

0

मुझे यकीन नहीं है कि आपका मतलब सफेद स्थान या ग्रे स्पेस है या नहीं। बाद के मामले में निम्नलिखित कार्य करता है:

private void dataViewImages_MouseUp(object sender, MouseEventArgs e) 
    { 
     DataGridView.HitTestInfo hit = dataViewImages.HitTest(e.X, e.Y); 
     if (hit.Type != DataGridViewHitTestType.Cell) 
      dataViewImages.ClearSelection(); 
    } 

मैं ग्रे स्पेस में क्लिक करके सभी कोशिकाओं को अचयनित करने के लिए उपयोग करता हूं।

+2

आपका उत्तर WinForms के लिए है, सवाल WPF के बारे में है। –

+0

मैथ्यू ने कहा, आपका जवाब प्रश्न के लिए अच्छा नहीं है, लेकिन आपने WinForms में एक ही समस्या को हल करने में मेरी मदद की। तो धन्यवाद! – leetNightshade

10

मेरे पास एक ही प्रश्न था और एक समाधान मिला।

private void dataGrid1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (sender != null) 
    { 
     DataGrid grid = sender as DataGrid; 
     if (grid != null && grid.SelectedItems != null && grid.SelectedItems.Count == 1) 
     { 
      DataGridRow dgr = grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem) as DataGridRow; 
      if (!dgr.IsMouseOver) 
      { 
       (dgr as DataGridRow).IsSelected = false; 
      } 
     } 
    }   
} 
+0

मुझे पता है कि यह साल पुराना है लेकिन फिर भी, "अगर (! Dgr.IsMouseOver)" के बजाय "अगर (dgr.IsMouseOver)" होना चाहिए? यह परिवर्तन के बाद मेरे लिए काम किया। – user2475983

+0

कुछ साल बाद, यह इंगित करना चाहते हैं कि वह वर्तमान में संपादित किए जा रहे सेल को छोड़ने के बाद ग्रिड को कॉल करने के लिए ग्रिड.कॉमिटएडिट() को कॉल कर सकता है (यदि कोई है तो)। यह विशेष रूप से कॉम्बोबॉक्स कोशिकाओं के मामले में सहायक हो सकता है। –

+0

मुझे यह समाधान उपयोगी पाया गया, भले ही यह कुछ साल पुराना हो। मैं यह इंगित करना चाहता हूं कि 'if() {...} 'कथन को' dgr.Is चयनित = dgr.IsMouseOver 'के लिए सरलीकृत किया जा सकता है, क्योंकि चेक और असाइनमेंट दोनों प्रकार के' बूल 'हैं। – Anders

0
private void dg_IsKeyboardFocusWithinChanged 
    (object sender, DependencyPropertyChangedEventArgs e) 
    { 
     if (dg.SelectedItem != null) { 
      dg.UnselectAll(); 
     } 
    } 
0

आप SelectionUnit="FullRow" है, तो आप UnselectAllCells() बजाय UnselectAll() उपयोग करने के लिए: यह व्यवहार में बनाया जाना चाहिए।

संबंधित मुद्दे