2013-06-06 63 views
17

Có cách nào để sắp xếp một chương trình WPF DataGrid (ví dụ, như nếu tôi nhấp vào cột đầu tiên của tôi).Sắp xếp một gói dữ liệu wpf theo lập trình

Có cách nào để mô phỏng nhấp chuột này không? Hay một cách tốt nhất?

Đây là mã của tôi:

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)); 

Tôi không biết tại sao, nhưng dòng "dv.Sort = "strEvtType";" gây ra một điều kỳ lạ, cửa sổ của tôi hiện lên và chương trình không tiếp tục thực hiện các dòng tiếp theo, tuy nhiên tôi không thấy các loại!

Thanks a lot,

Trân trọng,

Nixeus

+0

bạn không thể sắp xếp xem DataGrid của bạn? Và làm mới bố cục? – Alex

+1

cho bạn một ví dụ xin vui lòng? làm thế nào làm điều này? Cảm ơn –

Trả lời

7

Nhận DataView của ItemsSource của bạn và sử dụng Sắp xếp tài sản của mình để xác định các cột bạn đang sắp xếp theo:

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

Xin chào, cảm ơn câu trả lời. Tên cột là gì, thuộc tính "tiêu đề"? Tôi không tìm thấy thuộc tính tên: ( –

+0

@WalterFabioSimoni Không, đó là tên của cột nguồn của bạn, mà bạn liên kết với DataGrid của mình. – Alex

+0

Ok, hiểu được! Tuy nhiên, khi chương trình đi trên dòng .Sort, của tôi cửa sổ chương trình Hiển thị và thats'all!Thật lạ lùng –

0

bạn có thể sử dụng ICollectionView để lọc, sắp xếp và nhóm các mục của bạn trong một DataGrid.

EDIT: thêm Sắp xếp, không đọc những câu hỏi một cách cẩn thận :)

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

nếu bạn không liên kết với một bộ sưu tập đối tượng nhưng đến một datatable - bạn phải sử dụng IBindingListView.Filter (http://msdn.microsoft.com/de-de/library/system.componentmodel.ibindinglistview_members(v=vs.80) .aspx) – blindmeis

29

giải pháp VoO đã không được làm việc cho tôi, ItemsSource là null, nhiều khả năng vì nó không trực tiếp thiết lập, nhưng ràng buộc. Tất cả các giải pháp khác tôi tìm thấy ở đây tại StackOverflow chỉ xử lý việc phân loại Mô hình, nhưng tiêu đề DataGrid không phản ánh việc sắp xếp.

Dưới đây là một giải pháp thích hợp dựa trên kịch bản không đầy đủ ở đây: 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(); 
} 

Trong trường hợp của mã của bạn, nó có thể được sử dụng như thế này:

SortDataGrid(myDataGridEvenements, 0, ListSortDirection.Ascending); 

Hoặc bằng cách sử dụng các giá trị tham số mặc định , chỉ cần:

SortDataGrid(myDataGridEvenements); 
+0

Phương pháp tuyệt vời, dễ sử dụng và sửa đổi. Cảm ơn. –

0

Phương pháp của tôi có hiệu quả đối với tôi. Chỉ cần thử mã này. Xin lỗi cho tiếng Nga

// Если таблица пустая, то привязываем ее к журналу 
      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 phương pháp của DataGrid là những gì thực sự được thực hiện trên nhấp chuột của tiêu đề cột. Tuy nhiên phương pháp này là nội bộ. Vì vậy, nếu bạn thực sự muốn mô phỏng các nhấp chuột bạn cần phải sử dụng phản ánh:

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] }); 
} 
Các vấn đề liên quan