如何修改代码让WPF DataGrid显示外键名称而非数据库表名
解决DataGrid外键显示为
dbname.tablename的问题 我懂你的困扰——现在外键关联的对象在DataGrid里默认显示的是实体类的完整限定名,而不是你想要的实际名称字段对吧?这是因为WPF默认会调用对象的ToString()方法,而LINQ to SQL生成的实体类默认ToString()就是输出类的完整命名空间+类名。下面给你两种实用的解决办法:
方法一:在XAML中指定绑定的具体名称字段
这种方式不需要修改后端代码,直接在DataGrid的列定义里明确绑定外键对象的目标属性就行。假设你的klant表有Naam(客户姓名)字段,chalet表有ChaletNaam(小屋名称)字段,你可以这样配置DataGrid:
<DataGrid x:Name="dgTest" AutoGenerateColumns="False"> <DataGrid.Columns> <!-- 常规字段列 --> <DataGridTextColumn Header="预订ID" Binding="{Binding ReserveringId}" /> <!-- 绑定外键对象的名称属性 --> <DataGridTextColumn Header="客户名称" Binding="{Binding klant.Naam}" /> <DataGridTextColumn Header="小屋名称" Binding="{Binding chalet.ChaletNaam}" /> <!-- 按需添加其他列 --> </DataGrid.Columns> </DataGrid>
记得把AutoGenerateColumns设为False,避免自动生成的默认列覆盖你的自定义配置。
方法二:重写实体类的ToString()方法
如果希望这些实体类在任何控件里默认显示的都是名称而非类名,可以给实体类重写ToString()方法。你可以在对应的实体部分类里添加代码:
public partial class klant { public override string ToString() { // 返回你想展示的客户名称字段 return this.Naam; } } public partial class chalet { public override string ToString() { // 返回你想展示的小屋名称字段 return this.ChaletNaam; } }
这样不管是DataGrid自动生成列,还是在ComboBox这类控件里使用这些对象,都会默认显示指定的名称。
另外注意你的后端代码里,目前只是获取了数据列表但没赋值给DataGrid的数据源,记得把注释的那行启用:
private void btnTest_Click(object sender, RoutedEventArgs e) { var listResv = db.reserverings.OrderBy(x => x.KlantId).ToList(); dgTest.ItemsSource = listResv; // 启用这行才能把数据绑定到网格 }
内容的提问来源于stack exchange,提问作者HiggerMan
相关产品推荐
相关产品推荐

