显示的行详细信息始终为空

本文关键字:详细信息 显示 | 更新日期: 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();