WPF DataGrid server sorting

Reprinted: http://www.kecq.com/artic-10322303.html

Data previously had a client, but is directly connected to the database, now that this is not a good way, then change the server RESTful API + client, the data are processed on the server side. Some of the problems encountered in the preparation process, because before did not use paging, the DataGrid will use the default sort on the line, but now needs a paging service side, we found some problems recorded.

  There is a DataGrid named dataGrid1 in XAML, click on the column header to sort only need to add Sorting properties in the above

<DataGrid  Grid.Row="2" x:Name="dataGrid1" AutoGenerateColumns="False" IsReadOnly="True"  AlternationCount="2" Sorting="dataGrid1_Sorting"  >

Initialization when you can specify a sort for a column

 ICollectionView view = CollectionViewSource.GetDefaultView(list);
 view.SortDescriptions.Clear();  //先清除所有的排序
 SortDescription sd = new SortDescription("列名",  ListSortDirection.Descending);
 view.SortDescriptions.Add(sd);

  

You can also specify in XAML, assuming that the column name is movieName

<DataGrid.Columns>

  <DataGridTextColumn Binding="{Binding Path=movieName}"     SortDirection="Ascending" SortMemberPath="movieName"  Header="名称"   />

</DataGrid.Columns>

Let's look at the main sorting method

Private  void dataGrid1_Sorting ( Object SENDER, DataGridSortingEventArgs E) 
        { 
            e.Handled = to true ;     // can not happen not to examine 
            pager.OrderColumn = e.Column.SortMemberPath; 
            an ICollectionView View = CollectionViewSource.GetDefaultView (dataGrid1.ItemsSource); 
 
            pager .Order = " ASC " ;   // default ascending 
            IF (view.SortDescriptions.Count> 0 ) 
            { 
                IF (view.SortDescriptions [ 0 ] == .propertyName e.Column.SortMemberPath)
                {
                    if (view.SortDescriptions[0].Direction == System.ComponentModel.ListSortDirection.Ascending)
                    {
                        pager.Order = "desc";
                    }
                    else if (view.SortDescriptions[0].Direction == ListSortDirection.Descending)
                    {
                        pager.Order = "asc";
                    }
                }
            }
 
            LoadData();
        }

e.Column.SortMemberPath to click on the column name column headers, the problem in e.Column.SortDirection this property, if the initialization when there is so designated first click when to get to, but then click on this property is null, and null is not specified, well, I'm here for its next assignment e.Column.SortDirection = ListSortDirection.Descending but when clicked it still is null somehow not found online. After long exploration, with another method

ICollectionView view = CollectionViewSource.GetDefaultView(dataGrid1.ItemsSource);

There can be obtained from view.SortDescriptions sort columns to determine which collection is greater than 0 and click on the column name is the current row, if the current is ascending to descending simultaneously query the data in descending order, of course, and finally had to perform cleanup ordering add sort

view.SortDescriptions.Clear ();   // erase all sort 
 SortDescription SD = new new SortDescription ( " Column Name " , ListSortDirection.Descending); 
 view.SortDescriptions.Add (SD);

This realization of the server-side sorting, I do not know whether the easier way.

supplement:

The article mentions: I'm here for its assignment e.Column.SortDirection = ListSortDirection.Descending ,. Here the actual effect after re-bind the data will be lost before ordering. Rebinding state should sort the columns in the bound data before

So I deal with this here,

1, the rear end of the last record of the status of a column name sort ascending or descending order

2, after data binding, once again assigned the current sort state. Swich current sort is recorded before rebinding ordering data, sorting of a column state case, then gridResult2.Columns [2] .SortDirection reset state ordering value for this column. This will reset the ranking value acquired in DataGridSortingEventArgs e e.Column.SortDirection properties. Such re-assignment, but also to show the sort that comes with a small arrow. I do not understand you can contact www.kaishanguai.com or qq369628105

 switch (CurrentOrderByEnum)
                {
                    case (OrderByEnum.OrderByNameAsc):
                        gridResult2.Columns[2].SortDirection = ListSortDirection.Ascending;
                        break;

                    case (OrderByEnum.OrderByNameDesc):
                        gridResult2.Columns[2].SortDirection = ListSortDirection.Descending;
                        break;

}​

 

Code:

                                <DataGrid x:Name="gridResult2" SelectionUnit="FullRow"  MinHeight="420"    EnableRowVirtualization ="False" GridLinesVisibility="None"  BorderThickness="0" AlternationCount="2" ItemsSource="{Binding}"  CanUserAddRows="False" HorizontalAlignment="Left"  VerticalAlignment="Top" AutoGenerateColumns="False" Visibility="Hidden"    IsReadOnly="True" SelectionMode="Extended"  Sorting="GridResult2_OnSorting"  MouseMove="GridResult2_OnMouseMove" MouseLeftButtonDown="GridResult2_OnMouseLeftButtonDown"  MouseLeftButtonUp="GridResult2_OnMouseLeftButtonUp" MouseRightButtonUp="ImageGrid_OnMouseRightButtonDown" LoadingRow="GridResult2_OnLoadingRow"   KeyDown="DataView_OnKeyDown" PreviewKeyDown="GridResult2_OnPreviewKeyDown">
                                    <!--SelectionChanged="GridResult2_OnSelectionChanged"  -->
                                    <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
                                    <DataGrid.CommandBindings>
                                        <CommandBinding Command="Copy" Executed="CopyCommand" />
                                    </DataGrid.CommandBindings>

                                    <!-- This is required to handle CTRL + C when something is selected in the DataGrid -->
                                    <DataGrid.InputBindings>
                                        <KeyBinding Key="C" Modifiers="Control" Command="Copy" />
                                    </DataGrid.InputBindings>
                                 
                               
                                    <DataGrid.Columns>
                                        <DataGridTemplateColumn>
                                            <DataGridTemplateColumn.HeaderTemplate>
                                                <DataTemplate>
                                                    <CheckBox  Name="ChkAll" ToolTip="All"  Content="All"   IsChecked="False" Unchecked="UnAll_Checked" Checked="All_Checked"></CheckBox>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.HeaderTemplate>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <CheckBox   Checked="ItemFile_OnChecked"  Unchecked="ItemFile_OnUnchecked" Tag="{Binding FilePath}" HorizontalAlignment="Center" x:Name="itemFile"   VerticalAlignment="Center" />
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTemplateColumn  Header="">
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <Image Source="{Binding SnapshotPath}" Height="20" Width="20" />
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTextColumn Header="Name" Binding="{Binding FileName}" />
                                        <DataGridTemplateColumn  Header="MD5">
                                            <DataGridTemplateColumn.HeaderStyle>
                                                <Style TargetType="DataGridColumnHeader">
                                                    <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
                                                </Style>
                                            </DataGridTemplateColumn.HeaderStyle>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock HorizontalAlignment="Center" Text="{Binding FileMD5}"></TextBlock>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTemplateColumn  Header="Modified Date" CanUserSort="True" SortMemberPath="FileModifiedTime">
                                            <DataGridTemplateColumn.HeaderStyle>
                                                <Style TargetType="DataGridColumnHeader">
                                                    <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
                                                </Style>
                                            </DataGridTemplateColumn.HeaderStyle>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock HorizontalAlignment="Center" Text="{Binding FileModifiedTime}"></TextBlock>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTextColumn Header="Path" Binding="{Binding FilePathNoName}" />

                                        <DataGridTemplateColumn  Header="Classify Type"  CanUserSort="True" SortMemberPath="ClassifyType">
                                            <DataGridTemplateColumn.HeaderStyle>
                                                <Style TargetType="DataGridColumnHeader">
                                                    <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
                                                </Style>
                                            </DataGridTemplateColumn.HeaderStyle>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock HorizontalAlignment="Center" Text="{Binding ClassifyType}"></TextBlock>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTemplateColumn  Header="Type">
                                            <DataGridTemplateColumn.HeaderStyle>
                                                <Style TargetType="DataGridColumnHeader">
                                                    <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
                                                </Style>
                                            </DataGridTemplateColumn.HeaderStyle>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock HorizontalAlignment="Center" Text="{Binding FileExtension}"></TextBlock>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>

                                        <DataGridTemplateColumn  Header="Size(KB)" CanUserSort="True"  SortMemberPath="FileSize">
                                            <DataGridTemplateColumn.HeaderStyle>
                                                <Style TargetType="DataGridColumnHeader">
                                                    <Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
                                                </Style>
                                            </DataGridTemplateColumn.HeaderStyle>
                                            <DataGridTemplateColumn.CellTemplate>
                                                <DataTemplate>
                                                    <TextBlock HorizontalAlignment="Center" Text="{Binding FileSize, StringFormat={}{0:N0}}"></TextBlock>
                                                </DataTemplate>
                                            </DataGridTemplateColumn.CellTemplate>
                                        </DataGridTemplateColumn>
                                    </DataGrid.Columns>
                                </DataGrid>
// After the binding data, to re-set the sort state      
gridResult2.ItemsSource = bindDataList; // set the sort icons IF (IsClickSort) { Switch (CurrentOrderByEnum) { Case (OrderByEnum.OrderByNameAsc): gridResult2.Columns [ 2 ] = .SortDirection ListSortDirection. Ascending; BREAK ; Case (OrderByEnum.OrderByNameDesc): gridResult2.Columns [ 2 ] = .SortDirection ListSortDirection.Descending; BREAK ; Case (OrderByEnum.OrderByModifiedDateAsc): gridResult2.Columns[4].SortDirection = ListSortDirection.Ascending ; break; case (OrderByEnum.OrderByModifiedDateDesc): gridResult2.Columns[4].SortDirection = ListSortDirection.Descending; break; case (OrderByEnum.OrderByClassifyAsc): gridResult2.Columns[6].SortDirection = ListSortDirection.Ascending; break; case (OrderByEnum.OrderByClassifyDesc): gridResult2.Columns[6].SortDirection = ListSortDirection.Descending ; break; case (OrderByEnum.OrderBySizeAsc): gridResult2.Columns[8].SortDirection = ListSortDirection.Ascending; break; case (OrderByEnum.OrderBySizeDesc): gridResult2.Columns[8].SortDirection = ListSortDirection.Descending; break; } } else { gridResult2.Columns[4].SortDirection = ListSortDirection.Descending; }
 
//排序事件
private void GridResult2_OnSorting(object sender, DataGridSortingEventArgs e) { ListSortDirection direction = (e.Column.SortDirection != ListSortDirection.Ascending) ? ListSortDirection.Ascending : ListSortDirection.Descending; bool sortAscending = direction == ListSortDirection.Ascending; switch (e.Column.SortMemberPath) { case ("FileName"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderByNameAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderByNameDesc; } break; case ("FileModifiedTime"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderByModifiedDateDesc; } break; case ("ClassifyType"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderByClassifyAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderByClassifyDesc; } break; case ("FileSize"): if (sortAscending) { CurrentOrderByEnum = OrderByEnum.OrderBySizeAsc; } else { CurrentOrderByEnum = OrderByEnum.OrderBySizeDesc; } break; } IsClickSort = true; Search(); }

 

Guess you like

Origin www.cnblogs.com/heifengwll/p/11349675.html
Recommended