Применить сортировку сетки данных к другой сетке данных - PullRequest
1 голос
/ 13 января 2011

У моего клиента есть это требование: alt text то есть сетка со складными столбцами. Самый простой способ, который я нашел для этого, - это иметь 3 отдельные сетки данных и 2 кнопки, чтобы показать или свернуть сетки.

Вот соответствующий XAML:

<StackPanel Orientation="Horizontal" Grid.Column="2" Grid.Row="0" VerticalAlignment="Stretch">

            <toolkit:DataGridDragDropTarget VerticalContentAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch">

                <sdk:DataGrid Name="Grid1" SelectionChanged="Grid_SelectionChanged" AutoGenerateColumns="False">
                    <sdk:DataGrid.Columns>
                        <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader" />
                        <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader" />
                        <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader"/>
                        <sdk:DataGridTextColumn Binding="{Binding somefield}" Header="someheader" />
                    </sdk:DataGrid.Columns>
                </sdk:DataGrid>

            </toolkit:DataGridDragDropTarget>

            <Button Content=">" Click="Button_Click" Name="btn1" />
            <sdk:DataGrid Name="Grid2" SelectionChanged="Grid_SelectionChanged" AutoGenerateColumns="False" ItemsSource="{Binding ItemsSource, ElementName=Grid1}">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" />
                    <sdk:DataGridCheckBoxColumn Header="someheader" Binding="{Binding somefield}" />
                    <sdk:DataGridCheckBoxColumn Header="someheader" Binding="{Binding somefield}" />
                    <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" />
                    <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" />
                </sdk:DataGrid.Columns>
            </sdk:DataGrid>

            <Button Content=">" Name="btn2" Click="Button_Click"/>
            <sdk:DataGrid Name="Grid3" SelectionChanged="Grid_SelectionChanged" AutoGenerateColumns="False"  ItemsSource="{Binding ItemsSource, ElementName=Grid1}">
                <sdk:DataGrid.Columns>
                    <sdk:DataGridTextColumn Header="someheader" Binding="{Binding somefield}" />
                </sdk:DataGrid.Columns>
            </sdk:DataGrid>

        </StackPanel>

Это работает правильно. Моя проблема возникает, когда я хочу отсортировать одну из сеток. Поскольку сортировка является внутренней по отношению к сетке данных, изменения не распространяются на другие (даже если они связаны с одним источником!)

Есть ли способ "распространить" сортировку на другие сетки? Я пытался найти способ перехватить событие сортировки, но его, похоже, не существует ...

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 24 января 2011
  1. Если вы используете три решения DataGrid, я думаю, вам лучше обернуть их в элемент управления и добавить несколько кнопок сортировки в этот элемент управления. Затем кнопки должны запустить сортировку ВСЕХ данных.

  2. Другой способ - использовать 1 DataGrid и изменить видимость столбцов, которые вы хотите скрыть.

1 голос
/ 20 января 2011

Зачем использовать 3 базы данных? Лучше использовать только 1 базу данных и страницу параметров, где человек может скрыть свои столбцы. Вы можете скрыть столбцы, используя DataGrid.Columns[0].Visibility = Visibility.Collapsed.

Вы можете сделать это с помощью кнопки над колонкой ... или где-нибудь флажком ... или страницей параметров. Много возможностей. Единственным недостатком является то, что это не может быть реализовано в MVVM, поскольку DataGridColumn не поддерживает привязку видимости.

Как ответ на ваш вопрос:

Возможно, эта информация поможет вам, просто примените сортировку к обоим сетям данных

private void Sort_DataGrid(object source,  System.Web.UI.WebControls.DataGridSortCommandEventArgs e)
{
    // Never use Queries like this always use Stored procedures

    SqlCommand myCommand = new SqlCommand("SELECT * FROM Categories", myConnection);                                                            
    myCommand.CommandType = CommandType.Text;
    SqlDataAdapter myAdapter = new SqlDataAdapter(myCommand);
    DataSet ds = new DataSet();
    myAdapter.Fill(ds,"Categories");
    DataView dv = new DataView(ds.Tables["Categories"]);
    if( (numberDiv%2) == 0 )
        dv.Sort = e.SortExpression + " " + "ASC";
    else
        dv.Sort = e.SortExpression + " " + "DESC";
    numberDiv++;
    myDataGrid.DataSource = dv;
    myDataGrid.DataBind();
}

Источник: http://www.codeproject.com/KB/webforms/SortingDataGridColumns.aspx

...