【问题标题】:Apply the sorting of a datagrid to another datagrid将数据网格的排序应用于另一个数据网格
【发布时间】:2011-01-13 13:46:16
【问题描述】:

我的客户有这个要求: 即具有可折叠列的网格。我发现最简单的方法是使用 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>

这工作正常。当我想对其中一个网格进行排序时,就会出现我的问题。由于排序是数据网格内部的,因此更改不会传播到另一个(即使很难,它们也绑定到同一个源!)。

有没有办法将排序“传播”到其他网格?我试图找到一种方法来拦截排序事件,但它似乎不存在......

提前致谢!

【问题讨论】:

    标签: sorting datagrid silverlight-4.0


    【解决方案1】:

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

    您可以使用列上方的按钮...或某处的复选框...或选项页面来执行此操作。很多机会。唯一的缺点是这不能在 MVVM 中实现,因为 DataGridColumn 不支持 Visibility Binding。

    作为对您问题的回答:

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

    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

    【讨论】:

    • 问题是关于 Silverlight。
    • 我仍然认为最好使用 1 个数据网格并更改列可见性。这为您节省了查找如何对数据网格进行排序的麻烦,因为除非您对绑定源进行排序,否则无法以编程方式将排序应用于数据网格。因此,不可能在数据网格排序发生更改时引发事件,也不可能通过 C#/silverlight(绑定)将排序应用于数据列。 (同样,除非对数据源进行)
    • 好的,谢谢,规格已更改,网格内的按钮已消失,取而代之的是,他们提出了您所说的内容(一个按钮,隐藏/显示额外的列)。无论如何,谢谢你考虑这个:-)
    【解决方案2】:
    1. 如果您坚持使用三个 DataGrid 解决方案,我认为您最好将它们包装在一个控件中,并向该控件添加一些排序按钮。然后按钮应该触发所有数据网格的排序。

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

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 2022-01-03
      • 2011-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多