2010-10-24 8 views
5

डब्ल्यूपीएफ के डेटाग्रिड नियंत्रण में, यदि आप डिफ़ॉल्ट स्तंभ प्रकारों (जैसे डेटाग्रिडटेक्स्ट कॉलम या डेटाग्रिड चेकबॉक्स कॉलम) में कॉलम सेट करते हैं, तो उस कॉलम पर सॉर्ट करें, और उसके बाद उसका मान बदलें, ग्रिड स्वचालित रूप से फिर से क्रमबद्ध किया जाएगा।डब्ल्यूपीएफ डाटाग्रिड: डेटाग्रिड टेम्पलेट कॉलम पर स्वचालित रूप से फिर से सॉर्ट करें

हालांकि, यदि आप डेटाग्रिड टेम्पलेट कॉलम (और कॉलम को सॉर्ट करने की अनुमति देते हैं) का उपयोग करते हैं, तो इसे सॉर्ट किया जा सकता है, लेकिन इस कॉलम में किसी सेल के मान को बदलने से ग्रिड को फिर से क्रमबद्ध नहीं किया जाता है। मैं इसे फिर से क्रमबद्ध करने में स्वचालित रूप से कैसे संयोजित कर सकता हूं?

XAML:

<DataGrid Name="grid" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="First name" Binding="{Binding First}"/> 
    <DataGridTemplateColumn Header="Last name" SortMemberPath="Last"> 
     <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Last}"/> 
     </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid>

बाइंडिंग:

ObservableCollection items = new ObservableCollection(); 
grid.ItemsSource = items; 
items.Add(new Character() { First = "Homer", Last = "Simpson" }); 
items.Add(new Character() { First = "Kent", Last = "Brockman" }); 
items.Add(new Character() { First = "Montgomery", Last = "Burns" });

यहाँ, अपने मद वर्ग बस मामला है कि प्रासंगिक है में:

public class Character : INotifyPropertyChanged { 
    private string first, last; 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void Notify(string name) { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(name)); 
    } 
    public string First { get { return first; } set { first = value; Notify("First"); } } 
    public string Last { get { return last; } set { last = value; Notify("Last"); } } 
}
+0

मेरे लिए ठीक काम कर रहा हो रहा है। क्या आपका मतलब है कि आप DataGridTemplateColumn के लिए SortMemberPath मान बदलते हैं? –

+1

यह तब होता है जब आप इसे स्पष्ट रूप से क्लिक करते हैं, या जब आप फर्स्टनाम कॉलम का मान बदलते हैं, लेकिन जब आप LastName कॉलम मान बदलते हैं तो पुन: क्रमबद्ध नहीं होता है। SortMemberPath को सेट करने से यह सॉर्ट करने की अनुमति मिलती है, लेकिन यह स्वचालित रूप से * फिर से क्रमबद्ध नहीं होती है, इसलिए समस्या। –

+0

इस स्थिति में मैंने एक आवश्यक संपत्ति के परिवर्तनों को देखा और कुछ कोलेक्शनव्यूऑफग्रिड.रफ्रेश() कहा; – vorrtex

उत्तर

4

मैं भी इस का जवाब देख रहा हूँ । (यह के साथ खुश नहीं है, लेकिन ...)

जब अपने संग्रह अद्यतन किया जाता है जब आप यह कर सकते हैं:: मैं एक समाधान पाया

SortDescription sortDescription = grdData.Items.SortDescriptions[0]; 
grdData.ItemsSource = null; 
grdData.ItemsSource = Data; 
grdData.Items.SortDescriptions.Add(sortDescription); 

बदसूरत, लेकिन यह काम करता है। आप पूरे उदाहरण को मेरे उदाहरण के विपरीत स्टोर करना चाहते हैं जो केवल पहला आइटम करता है।

इसके साथ एक समस्या यह है कि डेटाग्रिड हेडर को खो देता है जो सॉर्ट को इंगित करता है, इसलिए हालांकि यह सही ढंग से रिसॉर्ट करता है, फिर भी कॉलम हेडर को क्रमशः दिशा की दिशा दिखाते हुए तीर के साथ नहीं चुना जाता है।

+0

'आइटमसोर्स 'को रीसेट करने की कोई आवश्यकता नहीं है। मेरे ऐप में 'SortDescriptions.Clear();' इसके बजाय पूरी तरह से काम करता है। –

0

मेरे पास वीएस -2010 के तहत सी # डब्ल्यूपीएफ में डेटाग्रिड था जो एक्सएएमएल सेटिंग्स के बावजूद सॉर्ट नहीं करेगा। किसी कारण से इस छिपे हुए डेटाग्रिड (द्वितीयक टैब पर) क्रमबद्ध क्रम में समस्याएं थीं जहां प्राथमिक डेटाग्रिड समान सेटिंग्स के साथ ठीक था। इस तरह मुझे डेटाग्रिड को आरेखणपूर्वक क्रमबद्ध करना पड़ा। यहाँ मेरी नोट नहीं हैं:

पहले XAML दो datagrids (प्राथमिक और माध्यमिक के लिए, हम केवल छँटाई हो जाएगा दूसरा "विस्तारित नाम" ग्रिड:

 <TabControl Grid.Row="1" Name="tabControl1" VerticalAlignment="Top" Style="{StaticResource Section}" Margin="3" Padding="0" FontFamily="Arial" FontSize="10" BorderThickness="0" > 
      <TabItem Name="tabCommon" Style="{StaticResource NameTab}"> 
       <DataGrid Name="grdCommonNames" SelectionChanged="grdCommonNames_SelectionChanged" PreviewKeyDown="grdCommonNames_PreviewKeyDown" Style="{StaticResource NameListGrid}" Focusable="False"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Binding="{Binding Name, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Name" CellStyle="{StaticResource NameListCol}" SortDirection="Ascending" /> 
         <DataGridTextColumn Binding="{Binding Pronunciation, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Pronunciation" CellStyle="{StaticResource NameListRightCol}"/> 
        </DataGrid.Columns> 
       </DataGrid> 
      </TabItem> 
      <TabItem Name="tabExtended" Style="{StaticResource NameTab}"> 
       <DataGrid Name="grdExtendedNames" SelectionChanged="grdCommonNames_SelectionChanged" PreviewKeyDown="grdCommonNames_PreviewKeyDown" Style="{StaticResource NameListGrid}" > 
        <DataGrid.Columns> 
         <DataGridTextColumn Binding="{Binding Name, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Name" CellStyle="{StaticResource NameListCol}" SortDirection="Descending" SortMemberPath="Name"/> 
         <DataGridTextColumn Binding="{Binding Pronunciation, NotifyOnTargetUpdated=True}" Width="SizeToCells" Header="Pronunciation" CellStyle="{StaticResource NameListRightCol}"/> 
        </DataGrid.Columns> 
       </DataGrid> 
      </TabItem> 
     </TabControl> 

तो दूसरा सॉर्ट करने के लिए कोड का टुकड़ा ऑन-क्लिक के बाद टैब डेटाग्रिड। हम केवल पहली बार सॉर्ट करते हैं, यही कारण है कि बुलियन यहां है। इस तरह यदि वे मैन्युअल रूप से अन्य कॉलम पर सॉर्ट करते हैं तो यह तब भी बनाए रखा जाता है जब वे पहले टैब पर वापस जाएं और फिर दूसरे टैब पर दोबारा जाएं।

यहां डाटाग्रिड में हमारा पहला कॉलम "नाम" नाम दिया गया है। ऑन क्लिक स्निपेट:

 if (!extendSorted) 
     { 
      SortDescription extSort = new SortDescription("Name", ListSortDirection.Ascending); 
      grdExtendedNames.Items.SortDescriptions.Add(extSort); 
      extendSorted = true; 
     } 

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

0

मुझे डेटाग्रिड में एक नई पंक्ति डालने पर एक ही समस्या थी। मैंने डेटाग्रिड के आइटम को रीफ्रेश करके इस समस्या को हल किया।

dataGrid.Items.Refresh()। यह सॉर्टिंग भी बहाल करता है।
मत भूलना DataGridColumn पर SortDirection स्थापित करने के लिए (इस मामले में यह एक DataGridTextColumn)

डेटा ग्रिड परिभाषा:

<DataGrid x:Name="dgCustomers" ItemsSource="{Binding CustomerTable}" AutoGenerateColumns="False" CanUserDeleteRows="True"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Kunden ID" Binding="{Binding Path=KundenID,Mode=TwoWay}" SortDirection="Ascending" /> 
      <DataGridTextColumn Header="Name" Binding="{Binding Path=Kundenname,Mode=TwoWay}"/> 
    </DataGrid.Columns> 
</DataGrid> 

सीएस फ़ाइल:

private void btnSavecustomerChanges_Click(object sender, RoutedEventArgs e) 
{   
    try   
    { 
     BL.UpdateCustomerChanges(); 
     dgCustomers.Items.Refresh(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message, "Fehler beim Speichern", MessageBoxButton.OK, MessageBoxImage.Error); 
    } 
} 
0
If DataGridMain.Items.SortDescriptions.Count > 0 Then 
     Dim vSortDescColl As New SortDescriptionCollection 
     For Each vSortDesc In DataGridMain.Items.SortDescriptions 
      vSortDescColl.Add(vSortDesc) 
     Next 
     DataGridMain.ItemsSource = Nothing 
     DataGridMain.ItemsSource = vCallColl 
     For Each vSortDesc In vSortDescColl 
      DataGridMain.Items.SortDescriptions.Add(vSortDesc) 
      For Each vColumn In DataGridMain.Columns 
       If vColumn.SortMemberPath = vSortDesc.PropertyName Then 
        vColumn.SortDirection = vSortDesc.Direction 
        Exit For 
       End If 
      Next 
     Next 
    End If 
+0

मैं सुझाव दूंगा कि आप अपने कोड का प्रस्ताव देने के लिए थोड़ा सा वर्णन जोड़ें, यह समझाने के लिए कि आप क्या कर रहे हैं और आप इस जवाब को दो साल के प्रश्न में क्यों जोड़ रहे हैं। – Rob

4

मुझे पता है कि यह पुराना है, लेकिन मुझे यह डेटाग्रिड टेम्पलेट कॉलम फिर से हल करने की समस्या भी मिली है। यह DataGridTextColumn पर नहीं होता है। जिस तरह से मैं इसे स्तंभ शीर्ष लेख पर ठीक बरकरार तरह दिशा के साथ है:

// after updating the collection, remove all SortDescription and add'em back. 
SortDescriptionCollection sortDescriptions = new SortDescriptionCollection(); 
foreach (SortDescription sd in dataGrid.Items.SortDescriptions) 
{ 
    sortDescriptions.Add(sd); 
} 
dataGrid.Items.SortDescriptions.Clear(); 

foreach (SortDescription sd in sortDescriptions) 
{ 
    dataGrid.Items.SortDescriptions.Add(sd); 
} 

आशा यह लोगों को मदद मिलती है।

0

शोध करे जवाब में से कोई भी 2016

में मेरे लिए काम किया कुछ & त्रुटि मैं इस के साथ आया था की कोशिश के बाद और यह सिर्फ अच्छा काम करने लगता है:

dataGrid.Items.IsLiveSorting = true; 
संबंधित मुद्दे