2010-11-09 23 views
6

दृश्य स्टूडियो काम नहीं करता है 2010 VB.NETDataGridView क्रमबद्ध

मैं एक DataGridView.DataSource कस्टम वस्तुओं का संग्रह करने के लिए सेट है। कॉलम प्रदर्शन के लिए कस्टम ऑब्जेक्ट से केवल गुणों को पढ़ते हैं, यह संवाद केवल प्रदर्शन के लिए है। गुण सभी स्ट्रिंग ऑब्जेक्ट्स लौटते हैं। मैंने स्वचालित रूप से सॉर्टमोड करने के लिए कॉलम को सेट किया है, लेकिन उनमें से 2 को सेट किया गया है (जो सेट नहीं हैं बटन या चेकबॉक्स है)। फिर भी यह सॉर्ट नहीं करता है। मैंने चारों ओर गुगल किया है और ज्यादातर लोग एसक्यूएल या बाध्यकारी स्रोतों का उपयोग करते हैं लेकिन मैं एक छोटा वीबी संग्रह का उपयोग कर रहा हूं। कुछ कहते हैं कि मुझे IComparable लागू करना चाहिए, लेकिन स्ट्रिंग पहले से ही असंभव नहीं है?

किसी भी मदद की सराहना की जाएगी?

Thanx

Bodger

एक अनुरोध के अनुसार यहाँ कुछ कोड के टुकड़े कर रहे हैं।

यह विधि कॉलम को डिज़ाइनर में डिज़ाइन किए गए कॉलम से विस्तार से परिभाषित करती है।

कॉलम नामों को pSelected या pCustomer कहा जाता है और कॉलम परिभाषा के संबंध में उसी नाम से संपत्ति के साथ मेल खाता है।


Protected Sub UpdateDGVUS() 
     If Not USColumnsInitted Then 
      USColumnsInitted = True 

      dgvUS.AutoGenerateColumns = False 
      dgvUS.Columns.Clear() 

      Dim iIdx As Integer 

      iIdx = 0 

      dgvUS.Columns.Insert(iIdx, Me.pSelected) 
      dgvUS.Columns("pSelected").DisplayIndex = iIdx 
      dgvUS.Columns("pSelected").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pCustomer) 
      dgvUS.Columns("pCustomer").DisplayIndex = iIdx 
      dgvUS.Columns("pCustomer").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDetails) 
      dgvUS.Columns("pDetails").DisplayIndex = iIdx 
      dgvUS.Columns("pDetails").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pSelectCustomerInvoice) 
      dgvUS.Columns("pSelectCustomerInvoice").DisplayIndex = iIdx 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDate) 
      dgvUS.Columns("pDate").DisplayIndex = iIdx 
      dgvUS.Columns("pDate").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pAmount) 
      dgvUS.Columns("pAmount").DisplayIndex = iIdx 
      dgvUS.Columns("pAmount").DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight 
      dgvUS.Columns("pAmount").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pName) 
      dgvUS.Columns("pName").DisplayIndex = iIdx 
      dgvUS.Columns("pName").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pPayment) 
      dgvUS.Columns("pPayment").DisplayIndex = iIdx 
      dgvUS.Columns("pPayment").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pCompany) 
      dgvUS.Columns("pCompany").DisplayIndex = iIdx 
      dgvUS.Columns("pCompany").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pType) 
      dgvUS.Columns("pType").DisplayIndex = iIdx 
      dgvUS.Columns("pType").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dgvUS.Columns.Insert(iIdx, Me.pDescription) 
      dgvUS.Columns("pDescription").DisplayIndex = iIdx 
      dgvUS.Columns("pDescription").SortMode = DataGridViewColumnSortMode.Automatic 
      iIdx = iIdx + 1 

      dataUpdatedUS() 
     End If 
    End Sub 

इस संग्रह


Public Class ItemXact01 
    Public Property FirstName As String 
    Public Property LastName As String 
    Public Property Company As String 
    Public Property Type As String 
    Public Property Description As String 
    Public Property RefNumber As String 
    Public Property DownloadID As String 
    Public Property Selected As Boolean 
    Public Property RequestID As Integer 

    ... 

    Public ReadOnly Property pCompany As String 
     Get 
      pCompany = Company 
     End Get 
    End Property 

    Public ReadOnly Property pType As String 
     Get 
      pType = Type 
     End Get 
    End Property 

    Public ReadOnly Property pDescription As String 
     Get 
      pDescription = Description 
     End Get 
    End Property 

    Public ReadOnly Property pSelected As Boolean 
     Get 
      pSelected = Selected 
     End Get 
    End Property 

में है कि कस्टम वस्तु का एक टुकड़ा है ...

डेटा इस कोड


    Private Sub dataUpdateDGV(ByRef dgv As DataGridView, ByRef myCollection As Collection) 
     myMain.Log("dataUpdatedDGV: 001 :" & dgv.RowCount & ":" & myCollection.Count & ":") 

' for some reason the not equal to does not show in the next line 

     If dgv.RowCount myCollection.Count Then 
      myMain.Log("dataUpdatedDGV: 002") 

      dgv.DataSource = Nothing 
      If myCollection.Count > 0 Then 
       myMain.Log("dataUpdatedDGV: 003") 

       dgv.DataSource = myCollection 
      End If 
     End If 

     myMain.Log("dataUpdatedDGV: 004") 

     dgv.Invalidate() 
     dgv.Update() 
     dgv.Refresh() 

     myMain.Log("dataUpdatedDGV: OUT") 
    End Sub 
+0

क्या आप 'डेटाग्रिड व्यू' को परिभाषित करने के लिए उपयोग किए जाने वाले कोड को पोस्ट कर सकते हैं। – ChrisF

+0

मैं संवाद के लिए डिजाइनर का उपयोग करता हूं। इसमें डेटा टैब्रिडव्यू वाले कुछ टैब वाले टैब नियंत्रक हैं। यहां मैं कुछ स्निपेट्स रख सकता हूं जो मुझे लगता है: – Bodger

उत्तर

1

यदि मुझे सही याद है तो आप संग्रह और डेटाग्रिडव्यू के बीच बाध्यकारी स्रोत डाल सकते हैं और बाध्यकारी स्रोत कार्यक्षमता का एक गुच्छा प्रदान करेगा। मुझे लगता है कि यह आपको भी क्रमबद्ध करने की अनुमति देता है। यह सिर्फ मेरे सिर के ऊपर से है क्योंकि मैं अभी इसका परीक्षण नहीं कर सकता।

+1

मुझे ईथर में सॉर्ट करने योग्य बाइंडिंगलिस्ट क्लास मिला और यह काम करता है। – Bodger

0

के साथ जगह में डाल दिया है यदि यह पूरी तरह से केवल पढ़ने के उद्देश्यों के लिए है, और आपको उपयोगकर्ता को डायनामिक सॉर्टिंग करने में सक्षम होने की आवश्यकता नहीं है, तो मैं आपको सलाह दूंगा डेटा स्रोत को सेट करने से पहले अपने कोड में संग्रह आरटी।

उदाहरण:

myDataGridView.DataSource = null; 
myCollection.Sort(); 
myDataGridView.DataSource = myCollection; 

है कि आप छँटाई डिफ़ॉल्ट मिल सकता है। यदि आपको गतिशील सॉर्टिंग को लागू करने की आवश्यकता है, मैं आपको अपनी myCollection.Sort() विधि का पुन: उपयोग करने की अनुशंसा करता हूं, जैसे प्रत्येक कॉलम को सॉर्ट करने के लिए बटन के साथ डेटाग्रिडव्यू के ऊपर एक नया पैनल डॉक किया गया है। उन बटनों में क्लिक ईवेंट को अपने .ort() विधि से लिंक करें, और किस कॉलम को क्रमबद्ध करने के लिए विधि में पैरामीटर जोड़ें।

यह थोड़ा सा काम है, लेकिन मुझे लगता है कि आपके माइक्रोसॉफ्ट घटकों को आपकी इच्छानुसार मोड़ने के बजाय कस्टम सॉर्टिंग परिदृश्य को लागू करने के लिए आपको और अधिक भाग्य मिलेगा।

+0

आपकी प्रतिक्रिया के लिए धन्यवाद, लेकिन मुझे इसे कस्टम सॉर्ट करने की आवश्यकता नहीं है, मैं बस इसे चयनित कॉलम द्वारा क्रमबद्ध करना चाहता हूं। जब मैं कॉलम हेडर पर क्लिक करता हूं तो कुछ भी नहीं होता है। – Bodger

4

यहां महत्वपूर्ण बात यह है कि डेटाग्रिड व्यू सॉर्ट करने के लिए ज़िम्मेदार नहीं है; अंतर्निहित डेटा-स्रोत (यानी डेटासोर्स का डेटासोर्स) है।

आप इस सॉर्टेबल बाइंडिंगलिस्ट (विंडोज के लिए) जैसे कुछ को कार्यान्वित कर सकते हैं।प्रपत्र) http://www.martinwilley.com/net/code/forms/sortablebindinglist.html

+0

आप सही हैं, लेकिन यह कहा जाना चाहिए कि यह एक विनाशकारी डिजाइन है। एक ग्रिड कैसे क्रमबद्ध किया जाता है स्पष्ट रूप से एक प्रेजेंटेशन पदार्थ होता है और इसे नियंत्रण द्वारा नियंत्रित किया जाना चाहिए। और स्पष्ट रूप से यह देखना मुश्किल है कि ऐसा क्यों करना मुश्किल होगा, जब तक कि कॉलम में बाध्य मूल्य एक ही प्रकार (आमतौर पर मामला) होते हैं और आईसीओम्पेर्बल को लागू करते हैं (जैसा कि सभी मूल डेटाटाइप करते हैं)। इस Winforms दृष्टिकोण का एक दुष्प्रभाव यह है कि आप एकाधिक विचारों की एक सूची को बाध्य नहीं कर सकते हैं, क्योंकि * डेटासोर्स * ट्रैक ऑर्डर और चयनित आइटम आदि। प्रत्येक के साथ जुड़े मुद्राओं की बहुत सारी रकम और ड्रॉपडाउन सूची के साथ एक दृश्य चित्रित करें। –

+0

किसी विशेष ग्रिड पर लागू सॉर्टिंग DataGridView में है। वास्तविक सॉर्टिंग के लिए ** विधि ** डेटासोर्स में है। –