2009-09-04 10 views
17

के साथ सॉर्टिंग मैं विंडोज फॉर्म डेटाग्रिड व्यू का उपयोग कर रहा हूं ताकि MyObject ऑब्जेक्ट्स की सामान्य सूची प्रदर्शित हो सके।सी # डेटाग्रिड व्यूइंग जेनेरिक सूची के साथ अंतर्निहित स्रोत

सबसे पहले मैं एक BindingSource संग्रह में इस संग्रह लपेट, तो:

dataGridView.DataSource = myBindingSource; 

मुझे क्या करना चाहते हैं उपयोगकर्ता एक ठोस संपत्ति का प्रतिनिधित्व कॉलम के हेडर पर Clickin द्वारा स्तंभों को क्रमित करने की अनुमति है MyObject में।

मैंने कुछ लेख पढ़े हैं जिन्हें मुझे बाध्यकारी से पहले सॉर्ट करना चाहिए। लेकिन यह मेरी मदद नहीं करता है अगर मैं वास्तविक समय में कॉलम को सॉर्ट करना चाहता हूं, तो कहा जा रहा है कि यह पहले से ही बांध चुका है।

सवाल यह है, वास्तव में क्या मैं क्या करने की जरूरत है, इसलिए मैं DataGridView में छँटाई तीर देख सकते हैं और मैं हर स्तंभ सॉर्ट सकता है?

+1

http://stackoverflow.com/questions/3770857/how-do-i-implement-automatic-sorting-of-datagridview देखें। यह रूप में आसान है के रूप में 'dataGridView.DataSource = नए BindingListView (myObjects.ToList())' http://sourceforge.net/projects/blw/ पर पुस्तकालय के साथ। – Pat

उत्तर

2

मेरे समाधान यह है:

मैं अपने ही में myBindingSource साथ काम करते हैं, मैं छँटाई करते हैं, एक अलग थ्रेड में ..whatever समूहीकरण। फिर मैं बस परिणाम को डेटाग्रिड व्यू पर बाध्य करता हूं।

myDataGridView.DataSource = bindingSource; 

इस उद्देश्य मैं सभी स्तंभों 'Programatically' (डिजाइनर में) तो मैं मैन्युअल तीर (आरोही/उतरते) जोड़ने क्रमबद्ध करना setted कर रखा है के पीछे कोड में

cell.SortGlyphDirection = ... ; 

की स्थापना द्वारा । जिसका डेटा स्रोत DataGridView के स्तंभ को क्रमबद्ध करने के लिए

0

पढ़ने यह मैंने देखा यह "यह पद्धति निर्दिष्ट स्तंभ में मानों की तुलना द्वारा DataGridView की सामग्री को क्रमबद्ध करता द्वारा इस artice

http://msdn.microsoft.com/en-us/library/0868ft3z.aspx

देखते हैं। डिफ़ॉल्ट रूप से, प्रकार आपरेशन विधि की तुलना का उपयोग करेगा DataGridViewCell .. ::। वैल्यू प्रॉपर्टी का उपयोग करके कॉलम में सेल्स के जोड़े की तुलना करने के लिए। "

शुभकामनाओं सहित, आयोर्डन

30

पूरा कोड एक सामान्य सूची

//----------------------------------------------------------------------------------------- 
//In the form - In constructor or form load, populate the grid. 
//-------------------------------------------------------------------------------------------- 

    List<student> students; 

    private void PopulateList() 
    { 
     student std1 = new student("sss", 15, "Female"); 
     student std2 = new student("ddd", 12, "Male"); 
     student std3 = new student("zzz", 16, "Male"); 
     student std4 = new student("qqq", 14, "Female"); 
     student std5 = new student("aaa", 11, "Male"); 
     student std6 = new student("lll", 13, "Female"); 

     students = new List<student>(); 
     students.Add(std1); 
     students.Add(std2); 
     students.Add(std3); 
     students.Add(std4); 
     students.Add(std5); 
     students.Add(std6); 

     dataGridView1.DataSource = students; 
    } 


//--------------------------------------------------------------------------------------------- 
//Comparer class to perform sorting based on column name and sort order 
//--------------------------------------------------------------------------------------------- 


class StudentComparer : IComparer<Student> 
{ 
    string memberName = string.Empty; // specifies the member name to be sorted 
    SortOrder sortOrder = SortOrder.None; // Specifies the SortOrder. 

    /// <summary> 
    /// constructor to set the sort column and sort order. 
    /// </summary> 
    /// <param name="strMemberName"></param> 
    /// <param name="sortingOrder"></param> 
    public StudentComparer(string strMemberName, SortOrder sortingOrder) 
    { 
     memberName = strMemberName; 
     sortOrder = sortingOrder; 
    } 

    /// <summary> 
    /// Compares two Students based on member name and sort order 
    /// and return the result. 
    /// </summary> 
    /// <param name="Student1"></param> 
    /// <param name="Student2"></param> 
    /// <returns></returns> 
    public int Compare(Student Student1, Student Student2) 
    { 
     int returnValue = 1; 
     switch (memberName) 
     { 
      case "Name" : 
       if (sortOrder == SortOrder.Ascending) 
       { 
        returnValue = Student1.Name.CompareTo(Student2.Name); 
       } 
       else 
       { 
        returnValue = Student2.Name.CompareTo(Student1.Name); 
       } 

       break; 
      case "Sex": 
       if (sortOrder == SortOrder.Ascending) 
       { 
        returnValue = Student1.Sex.CompareTo(Student2.Sex); 
       } 
       else 
       { 
        returnValue = Student2.Sex.CompareTo(Student1.Sex); 
       } 
       break; 
      default: 
       if (sortOrder == SortOrder.Ascending) 
       { 
        returnValue = Student1.Name.CompareTo(Student2.Name); 
       } 
       else 
       { 
        returnValue = Student2.Name.CompareTo(Student1.StudentId); 
       } 
       break; 
     } 
     return returnValue; 
    } 
} 



//--------------------------------------------------------------------------------------------- 
// Performing sort on click on Column Header 
//--------------------------------------------------------------------------------------------- 

    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     //get the current column details 
     string strColumnName = dataGridView1.Columns[e.ColumnIndex].Name; 
     SortOrder strSortOrder = getSortOrder(e.ColumnIndex); 

     students.Sort(new StudentComparer(strColumnName, strSortOrder)); 
     dataGridView1.DataSource = null; 
     dataGridView1.DataSource = students; 
     customizeDataGridView(); 
     dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = strSortOrder; 
    } 

    /// <summary> 
    /// Get the current sort order of the column and return it 
    /// set the new SortOrder to the columns. 
    /// </summary> 
    /// <param name="columnIndex"></param> 
    /// <returns>SortOrder of the current column</returns> 
    private SortOrder getSortOrder(int columnIndex) 
    { 
     if (dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.None || 
      dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.Descending) 
     { 
      dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending; 
      return SortOrder.Ascending; 
     } 
     else 
     { 
      dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending; 
      return SortOrder.Descending; 
     } 
    } 
+0

ग्रेट समाधान, बहुत बहुत धन्यवाद! मैंने समय लिया और थोड़ा सा सुधार किया, हालांकि। –

6

मैं इसे कठिन विश्वास करने के लिए ग्रिड बॉक्स से बाहर मूलभूत रूप से क्रमबद्ध प्रदान नहीं करता है लगता है, किसी कोड की आवश्यकता है। आखिरकार, हेडर क्लिक इवेंट को संभालने के लिए यह बहुत मूर्खतापूर्ण है और कॉलम इंगित करने वाले डेटाग्रिड व्यू। को कॉल करें (जिसे क्लिक किया गया था, ग्रिड द्वारा ट्रैक किया गया था) और क्रमबद्ध दिशा (वर्तमान सॉर्ट स्टेट द्वारा निर्धारित, ग्रिड द्वारा ट्रैक किया गया)।

क्यों कोई सॉर्टमोड या एक AllowUserToSort प्रॉपर्टी नहीं है जो डिफ़ॉल्ट रूप से वही चीज़ करता है?

मैंने अपनी ग्रिड को एक सूची में बाध्य कर दिया है और गुणों को मैप किए गए गुणों को स्ट्रिंग, int, डेटटाइम आदि जैसे सभी मूल प्रकार हैं। जिनमें से सभी IComparable हैं। तो मुझे पृथ्वी पर कोड की एक पंक्ति लिखने की आवश्यकता क्यों है?विशेष रूप से यह देखते हुए कि प्रलेखन पढ़ता है:

डिफ़ॉल्ट रूप से, उन डेटा में एक DataGridView नियंत्रण एक पाठ बॉक्स स्तंभ के हेडर पर क्लिक करके सॉर्ट कर सकते हैं।

MSDN

फ्रेमवर्क 3.0 दस्तावेज़ है कि, और मैं 3.5 लक्षित कर रहा हूँ, लेकिन "अन्य संस्करणों" सभी दृश्य स्टूडियो के संस्करणों, नहीं फ्रेमवर्क के संस्करण को देखें। माइक्रोसॉफ्ट पर पृथ्वी पर क्या चल रहा है?!

+0

बीटीडब्ल्यू मेरे कॉलम सभी प्रकार के डेटाग्रिड व्यूटेक्स्टबॉक्स कॉलम हैं - जो शायद "टेक्स्ट बॉक्स कॉलम" कहकर एमएस का मतलब है। –

+0

एक SortMode नहीं है, लेकिन यह कुछ भी नहीं करना प्रतीत होता है! – ProfK

0

तुम भी इस पोस्ट जहां दो दिलचस्प लिंक एक स्वनिर्धारित SortableBindingList लागू करने के लिए प्राप्त कर सकते हैं करने के लिए एक बार देख ले सकते हैं:

Sort Datagridview columns when datasource binded to List(Of T)

0

यहाँ प्रतिबिंब और Linq का उपयोग कर स्तंभ से सॉर्ट करने के लिए एक सरल उपाय है। dataGridView1 के डेटा स्रोत जो घोषित किया जाता है compareList पर सेट किया जाता है:

private List<CompareInfo> compareList; 


    private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
     string strColumnName = dataGridView1.Columns[e.ColumnIndex].Name; 
     SortOrder strSortOrder = getSortOrder(e.ColumnIndex); 

     if (strSortOrder == SortOrder.Ascending) 
     { 
      compareList = compareList.OrderBy(x => typeof(CompareInfo).GetProperty(strColumnName).GetValue(x, null)).ToList(); 
     } 
     else 
     { 
      compareList = compareList.OrderByDescending(x => typeof(CompareInfo).GetProperty(strColumnName).GetValue(x, null)).ToList(); 
     } 
     dataGridView1.DataSource = compareList; 
     dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = strSortOrder; 
    } 

    private SortOrder getSortOrder(int columnIndex) 
    { 
     if (dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.None || 
      dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.Descending) 
     { 
      dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending; 
      return SortOrder.Ascending; 
     } 
     else 
     { 
      dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending; 
      return SortOrder.Descending; 
     } 
    } 


public class CompareInfo 
{ 
    public string FileName { get; set; } 

    public string UAT_Folder { get; set; } 

    public string UAT_Path 
    { 
     get { return UAT_Folder + FileName; } 
    } 

    public string PROD_Folder { get; set; } 

    public string PROD_Path 
    { 
     get { return PROD_Folder + FileName; } 
    } 
} 
+0

मैं इस समाधान थोड़ा संशोधित एक तेजी से परिणाम प्राप्त करने के लिए। मैंने strColumnName के नाम के बजाय DataPropertyName का उपयोग किया, और मैंने अपनी तुलना सूची शीर्ष पर क्लिक ईवेंट के अंदर डाली: var comparList = (dataGridView1.DataSource सूची ) के रूप में; यह एक-एक ऐप के लिए मेरी ज़रूरतों के लिए काफी अच्छा था। – archangel76

0

जब सूची के लिए बाध्य DataGridView साथ छँटाई इस मुद्दे को हल करने के लिए है, यदि आप बहुत बड़ा डेटा तो शायद सेट के साथ काम नहीं कर रहे हैं आप कन्वर्ट करने के लिए प्रयास कर सकते हैं एक और विकल्प DataTable सूची, और फिर BindingSource/DataGridView के परिणामस्वरूप DataTable बाँध।

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

DataTable सूची में परिवर्तित करने का संक्षिप्त रास्ता के लिए यह जांच: https://stackoverflow.com/a/34062898/4534493

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