2013-06-06 5 views
17

C'è un modo per ordinare programmaticamente una WPF DataGrid (ad esempio, come se avessi fatto clic sulla mia prima colonna).Ordinare un datagrid wpf al livello di programmazione

C'è un modo per simulare questo clic? O un modo migliore?

Ecco il mio codice:

Collection_Evenements = new ObservableCollection<Evenement>(); 

Collection_Evenements = myEvenement.GetEvenementsForCliCode(App.obj_myClient.m_strCode); 
Collection_Evenements.CollectionChanged += Collection_Evenements_CollectionChanged; 
myDataGridEvenements.ItemsSource = Collection_Evenements; 

System.Data.DataView dv = (System.Data.DataView)myDataGridEvenements.ItemsSource; 
dv.Sort = "strEvtType"; 

myDataGridEvenements.Focus(); 
myDataGridEvenements.SelectedIndex = 0; 
myDataGridEvenements.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); 

Non so perché, ma la linea "dv.Sort = "strEvtType";" causa una cosa strana, il mio Window Show up e il programma non continuano ad eseguire le righe successive, tuttavia non vedo il genere!

Grazie mille,

Con i migliori saluti,

Nixeus

+0

Non riesci a ordinare la visualizzazione DataGrid? E aggiorna il layout? – Alex

+1

hai un esempio per favore? come si fa? Grazie –

risposta

7

Prendi DataView del ItemsSource e usare la sua proprietà Sort per specificare la colonna si ordina da:

(yourDataGrid.ItemsSource as DataView).Sort = "NAME_OF_COLUMN"; 
+0

Ciao, grazie per la risposta. Qual è il nome della colonna, è la proprietà "header"? Non ho trovato la proprietà name :( –

+0

@WalterFabioSimoni No, è il nome della colonna della tua fonte, che ti leghi al tuo DataGrid. – Alex

+0

Ok, capito! Tuttavia, quando il programma va sulla linea .Sort, il mio finestra del programma Mostra e tutto qui!È strano –

0

voi possibile utilizzare ICollectionView per filtrare, ordinare e raggruppare gli articoli in un datagrid.

EDIT: aggiungere Ordina, non ha letto la questione :) attentamente

var view = CollectionViewSource.GetDefaultView(this.MyData); 
view.Filter = ViewFilter; 
view.SortDescriptions.Add(new SortDescription("MyPropertyToSort", ListSortDirection.Descending)); 


    private bool ViewFilter(object obj) 
    { 
     var item = obj as MyObject; 

     if (item == null) 
      return false; 

     //your filter logik goes here 

     if(item.MyStringProp.StartsWith("Test")) 
      return false; 

     return true; 


    } 
+0

se non si esegue il binding a una raccolta di oggetti ma a un datatable, è necessario utilizzare IBindingListView.Filter (http://msdn.microsoft.com/de-de/library/system.componentmodel.ibindinglistview_members(v=vs.80) .aspx) – blindmeis

29

soluzione di voo non funzionava per me, ItemsSource era nullo, molto probabilmente perché non è stato impostato direttamente, ma legato. Tutte le altre soluzioni che ho trovato qui su StackOverflow riguardavano solo l'ordinamento del modello, ma l'intestazione DataGrid non rifletteva l'ordinamento.

Ecco una soluzione adeguata in base al copione incompleta qui: http://dotnetgui.blogspot.co.uk/2011/02/how-to-properly-sort-on-wpf-datagrid.html

public static void SortDataGrid(DataGrid dataGrid, int columnIndex = 0, ListSortDirection sortDirection = ListSortDirection.Ascending) 
{ 
    var column = dataGrid.Columns[columnIndex]; 

    // Clear current sort descriptions 
    dataGrid.Items.SortDescriptions.Clear(); 

    // Add the new sort description 
    dataGrid.Items.SortDescriptions.Add(new SortDescription(column.SortMemberPath, sortDirection)); 

    // Apply sort 
    foreach (var col in dataGrid.Columns) 
    { 
     col.SortDirection = null; 
    } 
    column.SortDirection = sortDirection; 

    // Refresh items to display sort 
    dataGrid.Items.Refresh(); 
} 

In caso di codice, può essere usato in questo modo:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending); 

o utilizzando i valori dei parametri di default , semplicemente:

SortDataGrid(myDataGridEvenements); 
+0

Metodo impressionante, facile da usare e modificare. Grazie. –

0

Il mio metodo è lavoro per me. Basta provare questo codice. Siamo spiacenti metodo per il russo

// Если таблица пустая, то привязываем ее к журналу 
      if(dgEvents.ItemsSource == null) 
       dgEvents.ItemsSource = events.Entries; 
      // Обновляем записи 
      CollectionViewSource.GetDefaultView(dgEvents.ItemsSource).Refresh(); 
      // Очищаем описание сортировки 
      dgEvents.Items.SortDescriptions.Clear(); 
      // Созадем описание сортировки 
      dgEvents.Items.SortDescriptions.Add(new SortDescription(dgEvents.Columns[0].SortMemberPath, ListSortDirection.Descending)); 

      // Очищаем сортировку всех столбцов 
      foreach (var col in dgEvents.Columns) 
      { 
       col.SortDirection = null; 
      } 
      // Задаем сортировку времени по убыванию (последняя запись вверху) 
      dgEvents.Columns[0].SortDirection = ListSortDirection.Descending; 
      // Обновляем записи 
      dgEvents.Items.Refresh(); 
0

PerformSort del DataGrid è ciò che effettivamente eseguito su di una colonna di intestazione clic. Tuttavia questo metodo è interno. Quindi, se si vuole veramente simulare il click è necessario utilizzare riflessione:

public static void SortColumn(DataGrid dataGrid, int columnIndex) 
{ 
    var performSortMethod = typeof(DataGrid) 
          .GetMethod("PerformSort", 
             BindingFlags.Instance | BindingFlags.NonPublic); 

    performSortMethod?.Invoke(dataGrid, new[] { dataGrid.Columns[columnIndex] }); 
}