我的客户有此要求: 即具有可折叠列的网格。我发现这样做的最简单方法是使用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>
这是正常的。当我想要排序其中一个网格时,我的问题就出现了。由于排序是数据网格的内部,因此更改不会传播到另一个(甚至很难将它们绑定到同一个源!)。
有没有办法将排序“传播”到其他网格?我试图找到一种拦截排序事件的方法,但它似乎不存在...
提前致谢!
答案 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)
如果您坚持使用三个DataGrid解决方案,我认为您最好将它们包装在一个控件中,并为此控件添加一些排序按钮。然后按钮应该触发所有数据网格的排序。
另一种方法是使用1个DataGrid并更改要隐藏的列的可见性。