2011-06-24 20 views
7

में उपयोगकर्ता परिभाषित सॉर्ट ऑर्डर को बनाए रखें मेरे पास एक WPF DataGrid है जो डेटासेट से डेटा के साथ पॉप्युलेट किया गया है। मेरे पास CanUserSortColumnsपर सेट है।WPF DataGrid

क्या ग्रिड रीफ्रेश होने पर उपयोगकर्ता द्वारा निर्दिष्ट सॉर्टिंग को बनाए रखना संभव है? मैं यह आइटम है कि इससे पहले कि ताज़ा जगह लेता है

object selectedItem = dgInvoiceHeads.SelectedItem; 

का उपयोग कर और फिर

dgInvoiceHeads.SelectedItem = selectedItem; 

रखने ताज़ा जगह लेता है के बाद चुना गया था बनाए रखने की है।

लेकिन मुझे यह निर्दिष्ट प्रकार को बनाए रखने के लिए प्रतीत नहीं होता है।

उत्तर

3

मेरे साथियों में से एक इस के साथ आया था। ऐसा लगता है कि यह सही ढंग से काम कर रहा है। एकमात्र चीज मुझे लगता है कि कॉलम हेडर को डेटाग्रिड में समान होना चाहिए क्योंकि वे डीबी में हैं।

string sortHeader; 
string prevSortHeader; 
SortDescription sd; 

private void dgInvoiceHeads_Sorting(object sender, DataGridSortingEventArgs e) { 
    sortHeader = e.Column.Header.ToString(); 

    if (sortHeader == prevSortHeader) { 
    sd = new SortDescription(sortHeader, ListSortDirection.Descending); 
    } 
    else { 
    sd = new SortDescription(sortHeader, ListSortDirection.Ascending); 
    } 
    prevSortHeader = sortHeader; 
} 

HTH

+2

हेडर संपत्ति के बजाय कॉलम इंस्टेंस में सॉर्टमेम्बरपाथ का उपयोग कर अपने हेडर को अपने क्लास सदस्यों के समान होने की समस्या के आसपास हो सकती है। 'sortHeader = e.Column.SortMemberPath' – BrianVPS

3

निम्नलिखित कोड को forum post से खींचा गया था और यह दिखाता है कि सॉर्ट विवरण और कॉलम जानकारी कैसे प्राप्त करें और इसे पुनर्स्थापित करें।

List<DataGridColumn> GetColumnInfo(DataGrid dg) { 
    List<DataGridColumn> columnInfos = new List<DataGridColumn>(); 
    foreach (var column in dg.Columns) { 
     columnInfos.Add(column); 
    } 
    return columnInfos; 
} 

List<SortDescription> GetSortInfo(DataGrid dg) { 
    List<SortDescription> sortInfos = new List<SortDescription>(); 
    foreach (var sortDescription in dg.Items.SortDescriptions) { 
     sortInfos.Add(sortDescription); 
    } 
    return sortInfos; 
} 

void SetColumnInfo(DataGrid dg, List<DataGridColumn> columnInfos) { 
    columnInfos.Sort((c1, c2) => { return c1.DisplayIndex - c2.DisplayIndex; }); 
    foreach (var columnInfo in columnInfos) { 
     var column = dg.Columns.FirstOrDefault(col => col.Header == columnInfo.Header); 
     if (column != null) { 
      column.SortDirection = columnInfo.SortDirection; 
      column.DisplayIndex = columnInfo.DisplayIndex; 
      column.Visibility = columnInfo.Visibility; 
     } 
    } 
} 

void SetSortInfo(DataGrid dg, List<SortDescription> sortInfos) { 
    dg.Items.SortDescriptions.Clear(); 
    foreach (var sortInfo in sortInfos) { 
     dg.Items.SortDescriptions.Add(sortInfo); 
    } 
} 
3

क्या आपने डेटासेट के लिए संग्रहदृश्य प्राप्त करने का प्रयास किया है?

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions 

यह आपको वर्तमान सॉर्टडिस्क्रिप्शन की एक सरणी देगा। फिर आप इन्हें जारी रख सकते हैं, और अगली बार दौर उन्हें

CollectionViewSource.GetDefaultView(yourDataSet).SortDescriptions.Add(...) 

उम्मीद है कि यह मदद करता है।

+2

हां! यह सही समाधान होना चाहिए .. और केवल एक ही होना चाहिए। और यदि मैं सही हूं, तो आपको पिछले सॉर्टिंग या ग्रुपिंग को "याद रखना" भी नहीं है: एक बार जब उन्हें आपके संग्रह ViewSource में घोषित किया जाता है, तो सभी नए जोड़े गए आइटम तदनुसार क्रमबद्ध किए जाएंगे, जैसे कि आप केवल ब्रूट फोर्स करते हैं।() '' ICollectionView 'ऑब्जेक्ट पर ... – Bruno

1
private void testGrid_Sorting(object sender, DataGridSortingEventArgs e) 
     { 

ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? 
           ListSortDirection.Ascending : ListSortDirection.Descending; 

// You will get the current direction in direction 

     } 

This is another solution 
संबंधित मुद्दे