2017-03-31 42 views
0

我有一個DataGrid,其中有HeadersVisibility="None"。 我想在DataGrid外部創建一個按鈕,它與我在DataGrid的n列上單擊(按順序排列)完全相同。通過單擊不在DataGrid的ColumnHeader上的按鈕對列進行排序c#

我曾嘗試下面的代碼(myDataGrid是我的DataGrid的名稱):

private void button_Click(object sender, RoutedEventArgs e) 
{ 
    DataGridColumn column = myDataGrid.Columns[0]; 
    DataGridColumnHeader columnHeader = GetColumnHeaderFromColumn(column); 
    columnHeader.OnClick(); 
} 

但功能DataGridColumnHeader.OnClick()無法訪問由於其保護級別。

我也看了看class DataGrid這是在哪裏namespace System.Windows.Controls我發現這一點:

public event DataGridSortingEventHandler Sorting; 

/// <summary> 
/// Protected method which raises the sorting event and does default sort 
/// </summary> 
/// <param name="eventArgs"></param> 
protected virtual void OnSorting(DataGridSortingEventArgs eventArgs) 
{ 
    eventArgs.Handled = false; 
    if (Sorting != null) 
    { 
     Sorting(this, eventArgs); 
    } 

    if (!eventArgs.Handled) 
    { 
     DefaultSort(
       eventArgs.Column, 
       /* clearExistinSortDescriptions */ 
       (Keyboard.Modifiers & ModifierKeys.Shift) != ModifierKeys.Shift); 
    } 
} 

/// <summary> 
/// Method to perform sorting on datagrid 
/// </summary> 
/// <param name="sortColumn"></param> 
internal void PerformSort(DataGridColumn sortColumn) 
{ 
    Debug.Assert(sortColumn != null, "column should not be null"); 

    if (!CanUserSortColumns || !sortColumn.CanUserSort) 
    { 
     return; 
    }    
    if (CommitAnyEdit()) 
    { 
     PrepareForSort(sortColumn); 

     DataGridSortingEventArgs eventArgs = new DataGridSortingEventArgs(sortColumn); 
     OnSorting(eventArgs); 

     if (Items.NeedsRefresh) 
     { 
      try 
      { 
       Items.Refresh(); 
      } 
      catch (InvalidOperationException invalidOperationException) 
      { 
       Items.SortDescriptions.Clear(); 
       throw new InvalidOperationException(SR.Get(SRID.DataGrid_ProbableInvalidSortDescription), invalidOperationException); 
      } 
     } 
    } 
} 

但我不能使用的。 有關我該怎麼做的任何想法?

回答

0

您應該使用SortDescriptions集合來代替。此集合允許您提供如何在視圖中對項目進行排序的一組規則。

你可以找到如何在這裏使用它一個很好的例子:https://stackoverflow.com/a/19952233/6597895

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(); 
} 
0
  1. 你將不得不申請對「數據視圖」排序並重新綁定到數據網格。

    private void SortButton_Click(object sender, System.EventArgs e) 
    { 
        if(order == SORT_ORDER.ASC) 
        { 
        //Ascending 
        this.BindData(SORT_ORDER.DESC); 
        } 
        else 
        { 
        //Descending 
        this.BindData(SORT_ORDER.ASC); 
        } 
    } 
    
    private void BindData(SORT_ORDER order) 
    { 
        //here read data from your datasource, by implementing that logic in 'GetDataSource()' function 
        DataView dv = this.GetDataSource().DefaultView; 
    
        if(order == SORT_ORDER.ASC) 
        { 
         dv.Sort = "Address ASC"; 
         this.SortLabel.Text = "Current sorting order is ascending"; 
        } 
        else 
        { 
         dv.Sort = "Address DESC"; 
         this.SortLabel.Text = "Current sorting order is descending"; 
        } 
        this.dgTest.DataSource = dv; 
    } 
    

或者

  • 如果你能使用的DataGridView這是很容易:
  • this.myDataGrid.Sort(this.dataGridViewTextBoxColumn1, ListSortDirection.Descending);

    相關問題