【发布时间】:2015-09-18 09:54:51
【问题描述】:
我对 WPF 中的嵌套数据网格有要求。
父网格显示消费者的订单信息。当用户单击订单信息中的详细信息时,需要在订单信息的父行内的子数据网格(意味着嵌套网格)中显示订购的商品详细信息。
为此,我使用<DataGrid.RowDetailsTemplate> 绑定子数据网格。
我的 XAML 代码如下。
<Popup Name="popup1" IsOpen="False" Placement="Mouse" Height="500" Width="700">
<Border BorderBrush="Black" BorderThickness="1" Background="White">
<StackPanel Orientation="Horizontal">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<DataGrid Grid.Row="0" Grid.Column="0" SelectedValuePath="orderid"
AutoGenerateColumns="False" Height="350"
HorizontalAlignment="Left" Margin="114,128,0,0" x:Name="gridOrder" VerticalAlignment="Top" Width="500">
<DataGrid.Columns>
<DataGridTemplateColumn Header="Order Status">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Button Content="{Binding OrderStatus}" Click="EditButton_Click" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Full Name" Binding="{Binding fullname}" />
<DataGridTextColumn Header="Order ID" Binding="{Binding orderid}" />
<DataGridTextColumn Header="Mobile" Binding="{Binding mobile}" />
<DataGridTextColumn Header="No. of Items" Binding="{Binding countofItems}" />
<DataGridTextColumn Header="Total Price" Binding="{Binding Total_Price}" />
<DataGridTextColumn Header="Order Status" Binding="{Binding OrderStatus}" />
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate>
<DataGrid x:Name="gridOrderDetails" AutoGenerateColumns="False"
Height="200" HorizontalAlignment="Left" Margin="121,132,0,0" VerticalAlignment="Top" Width="200">
<DataGrid.Columns>
<DataGridTextColumn Header="Item ID" Binding="{Binding itemid}" />
<DataGridTextColumn Header="Item Name" Binding="{Binding ItemName}" />
<DataGridTextColumn Header="Item No." Binding="{Binding ItemNo}" />
<DataGridTextColumn Header="Quantity" Binding="{Binding quantity}" />
<DataGridTextColumn Header="Comments" Binding="{Binding comments}" />
<DataGridTextColumn Header="Item Price" Binding="{Binding ItemPrice}" />
<DataGridTextColumn Header="Quantity" Binding="{Binding quantity}" />
</DataGrid.Columns>
</DataGrid>
</DataTemplate>
</DataGrid.RowDetailsTemplate>
</DataGrid>
<Button Content="Close" Grid.Row="1" Grid.Column="1" Click="PopUp_OK_Click"/>
</Grid>
</StackPanel>
</Border>
</Popup>
我的C#代码如下:
private void EditButton_Click(object sender, RoutedEventArgs e)
{
try
{
DBDataContext dbContext = new DBDataContext();
SP_Get_OrderItemResult orderRow = gridOrder.SelectedItem as SP_Get_OrderItemResult;
DataGrid grid = gridOrder.FindResource("gridOrderDetails") as DataGrid;
grid.ItemsSource = dbContext.SP_Get_ItemList(orderRow.orderid);
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
return;
}
}
我无法将 gridOrder 的 orderid 传入 FindResource(:gridOrderDetails").
DataGrid grid = gridOrder.FindResource("gridOrderDetails") as DataGrid;
在上一行出现错误,因为 'gridOrderDetails' 资源不是 找到了。
【问题讨论】:
-
无论如何,即使您能够找到嵌套的 DataGrid,您也是在整个主 DataGrid 中搜索...如果同时显示多个嵌套的 DataGrid 会怎样?
-
在主数据网格中只显示订单表中的订单信息。在显示订单项目详细信息的子数据网格中,它来自另一个表 OrderItemdetails 表。
-
我明白了。但是您应该确保任何时候都只显示一个 RowDetail。您应该指定
SelectionMode="Single",否则您的用户将能够通过使用Ctrl+单击选择行来打开多个RowDetail。