显示的行详细信息始终为空
本文关键字:详细信息 显示 | 更新日期: 2023-09-27 18:06:17
我有以下xaml:
<Window x:Class="level4.Workers"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:level4"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Title="Workers" Height="300" Width="400">
<Window.Resources>
<!--The workers DataBase-->
<ObjectDataProvider x:Key="WorkersDataProvider" ObjectType="{x:Type local:WorkerAdapter}"/>
<ObjectDataProvider x:Key="Workers" ObjectInstance="{StaticResource WorkersDataProvider}" MethodName="getWorkers"/>
<!--The person data provider-->
<ObjectDataProvider x:Key="PersonDataProvider" ObjectType="{x:Type local:PersonAdapter}" />
<ObjectDataProvider x:Key="Person" ObjectInstance="{StaticResource PersonDataProvider}" MethodName="getPersonByID">
<ObjectDataProvider.MethodParameters>
<sys:Int32>0</sys:Int32>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<Grid DataContext="{Binding Source={StaticResource Workers}}">
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" SelectionChanged="WorkersSelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Header="workers ID" Binding="{Binding WID}" />
<DataGridTextColumn Header="salary (k/m)" Binding="{Binding SALARY}" />
<DataGridTextColumn Header="worker's rank" Binding="{Binding WRANK}" />
<DataGridTextColumn Header="Seniority" Binding="{Binding SENIORITY}" />
<DataGridHyperlinkColumn Header="works in branch:" Binding="{Binding BRANCHNUM}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<Grid DataContext="{Binding Source={StaticResource Person}}">
<DataGrid ItemsSource="{Binding Source={StaticResource Person}}" CanUserAddRows="False" IsReadOnly="True" HeadersVisibility="None" AutoGenerateColumns="True" />
</Grid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
</Grid>
</Window>
函数WorkersSelectionChanged
如下:
private void WorkersSelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid grid = sender as DataGrid;
ObjectDataProvider PersonProvider = this.FindResource("Person") as ObjectDataProvider;
System.Data.DataRowView drv = grid.SelectedItem as System.Data.DataRowView;
PersonProvider.MethodParameters[0] = Int32.Parse(drv["PID"].ToString());
}
函数getPersonByID
如下:
public DataView getPersonByID(Int32 PID)
{
DataRow datarow = dt.Select(String.Format("PID = {0}", PID)).FirstOrDefault();
DataTable ret = new DataTable();
ret.ImportRow(datarow);
return ret.DefaultView;
}
问题:工人表正确显示,但行详细信息始终是一个空表。我用调试器检查了一下,每次我选择一行函数getPersonByID
被调用,具有正确的PID值,数据表ret
有一些行,但显示的表仍然是空的。
我哪里做错了?
我使用的是VS2012, .NET framework 4.5
总结评论你的新DataTable
没有列所以用DataTable.Clone
代替创建新的DataTable
克隆数据表的结构,包括所有的数据表模式和约束。
所以在你的例子中替换
DataTable ret = new DataTable();
DataTable ret = dt.Clone();