You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带外键关联的两张表数据导入DataGrid?

问题描述

我有两张通过外键关联的数据库表,已创建对应实体类User_Tbl.cs和RegFee_Tbl.cs。现有一个名为membersdataGrid的DataGrid控件,其中3列需绑定RegFee_Tbl的数据,1列绑定User_Tbl的数据。目前在Dashboard用户控件的Load方法中只能加载单个表的数据,不知道如何将两张关联表的数据一起导入到DataGrid中。

现有代码

Dashboard.cs 加载方法

public partial class Dashboard : UserControl
{
    GymDbEntities db = new GymDbEntities();
    public static DataGrid datagrid;
    public Dashboard()
    {
        InitializeComponent();
        Load();
    }

    private void Load()
    {
        membersdataGrid.ItemsSource = db.User_Tbl.ToList();
        //membersdataGrid.ItemsSource = db.RegFee_Tbl.ToList();
        datagrid = membersdataGrid;
    }
}

DataGrid的XAML代码

<DataGrid Language="fa-IR" x:Name="membersdataGrid" RowStyle="{DynamicResource DataGridRowStyle1}" ColumnHeaderStyle="{DynamicResource DataGridColumnHeaderStyle1}" CellStyle="{DynamicResource DataGridCellStyle1}" Style="{DynamicResource DataGridStyle1}">
    <DataGrid.Columns>
        <!--bara eyjad sotone checkbox-->
        <DataGridCheckBoxColumn CanUserResize="False" Width="auto" ElementStyle="{StaticResource CheckBoxStyle1}">
            <DataGridCheckBoxColumn.HeaderTemplate>
                <DataTemplate>
                    <CheckBox Style="{StaticResource CheckBoxStyle1}" />
                </DataTemplate>
            </DataGridCheckBoxColumn.HeaderTemplate>
        </DataGridCheckBoxColumn>

        <DataGridTextColumn Header="#" IsReadOnly="True" CanUserReorder="False" Width="auto" Binding="{Binding ID}"/>

        <DataGridTemplateColumn Header="اعضا" IsReadOnly="True" Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Border Width="25" Height="25" CornerRadius="50" Margin="0 0 10 0" Background="{Binding BgColor}">
                            <TextBlock Text="{Binding Character}" VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White" Margin="0 0 0 1"/>
                        </Border>
                        <TextBlock Text="{Binding Name}"  VerticalAlignment="Center"/>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>

        <DataGridTextColumn  Header="نام پدر" IsReadOnly="True" Width="*" Binding="{Binding Fee}"/>
        <DataGridTextColumn  Header="شماره تماس" IsReadOnly="True" Width="*" Binding="{Binding NumberPhone}"/>
        <DataGridTextColumn  Header="آخرین واریزی" IsReadOnly="True" Width="*" Binding="{Binding FatherName}" />

        <DataGridTemplateColumn Header="عملیات" IsReadOnly="True" Width="auto">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Button  x:Name="GridEditBtn" Style="{StaticResource gridEditbutton}">
                            <Icon:PackIconMaterial Kind="PencilBoxOutline" Style="{StaticResource gridButtonIcon}"/>
                        </Button>
                        <Button x:Name="GridRemoveBtn" Click="GridRemoveBtn_Click" Style="{StaticResource gridRemovebutton}" Margin="5 0 0 0" >
                            <Icon:PackIconMaterial Kind="DeleteOutline" Style="{StaticResource gridButtonIcon}" />
                        </Button>
                    </StackPanel>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>
解决方案

方法1:用Entity Framework Include加载关联数据

利用EF的Include方法预加载关联实体,直接通过导航属性访问关联表数据:

  1. 修改Load方法,预加载关联的RegFee_Tbl数据(假设User_Tbl中有名为RegFee_Tbl的导航属性):
private void Load()
{
    var data = db.User_Tbl.Include(u => u.RegFee_Tbl).ToList();
    membersdataGrid.ItemsSource = data;
    datagrid = membersdataGrid;
}
  1. 调整DataGrid中绑定RegFee_Tbl属性的列,补充导航属性路径:
<!-- 比如Fee是RegFee_Tbl的属性,修改绑定路径 -->
<DataGridTextColumn  Header="نام پدر" IsReadOnly="True" Width="*" Binding="{Binding RegFee_Tbl.Fee}"/>

其他属于RegFee_Tbl的属性,都要按此格式修改绑定路径;属于User_Tbl的属性保持原绑定不变。

方法2:创建DTO类整合数据

如果不想直接使用实体类,可创建专门用于DataGrid展示的DTO类,整合两张表的所需属性:

  1. 定义DTO类:
public class MemberDto
{
    public int ID { get; set; }
    public string BgColor { get; set; }
    public string Character { get; set; }
    public string Name { get; set; }
    // User_Tbl属性
    public string NumberPhone { get; set; }
    public string FatherName { get; set; }
    // RegFee_Tbl属性
    public decimal Fee { get; set; }
}
  1. 在Load方法中查询并映射到DTO(替换实际的外键关联字段,比如u.ID equals rf.UserId):
private void Load()
{
    var data = from u in db.User_Tbl
               join rf in db.RegFee_Tbl on u.ID equals rf.UserId
               select new MemberDto
               {
                   ID = u.ID,
                   BgColor = u.BgColor,
                   Character = u.Character,
                   Name = u.Name,
                   NumberPhone = u.NumberPhone,
                   FatherName = u.FatherName,
                   Fee = rf.Fee
               };
    membersdataGrid.ItemsSource = data.ToList();
    datagrid = membersdataGrid;
}

这种方式下,原DataGrid的绑定无需修改。

注意事项

  • 确保实体类的导航属性配置正确,否则Include方法无法加载关联数据。
  • 如果是一对多关系,需调整绑定逻辑(比如用DataTemplate展示多条关联数据),若只需最新一条关联数据,可在查询时先筛选。

内容的提问来源于stack exchange,提问作者Mehran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:45:34