将datagrid的排序应用于另一个datagrid

时间:2011-01-13 13:46:17

标签: sorting datagrid silverlight-4.0

我的客户有此要求: 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 个答案:

答案 0 :(得分:1)

为什么要使用3个数据库? 最好只使用1个数据库和一个人员可以隐藏他/她的列的选项页面。 您可以使用DataGrid.Columns[0].Visibility = Visibility.Collapsed隐藏到列。

您可以使用列上方的按钮..或某处的复选框...或选项页面来执行此操作。很多oppertunaties。唯一的缺点是,由于DataGridColumn不支持可见性绑定,因此无法在MVVM中实现。

作为对你问题的回答:

也许这些信息可以帮助您,只需对两个数据网格应用排序

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

答案 1 :(得分:1)

  1. 如果您坚持使用三个DataGrid解决方案,我认为您最好将它们包装在一个控件中,并为此控件添加一些排序按钮。然后按钮应该触发所有数据网格的排序。

  2. 另一种方法是使用1个DataGrid并更改要隐藏的列的可见性。