C# 绑定数据源但显示其他内容

C# 绑定数据源但显示其他内容,c#,winforms,dataview,linq-to-dataset,C#,Winforms,Dataview,Linq To Dataset,我有很多地方需要将表单控件直接绑定到支持数据库。我正在使用LINQtoDataSet来实现这一点 例如,我有一个组合框,其中包含由数据库查询填充的条目。当然,问题是我的所有数据都使用数字ID,我需要进行表查询,将其转换为用户可读的选项 通常我会加入第二个表,并使用combobox DisplayMember指向用户可读的字符串列。这不起作用,因为在查询上使用联接或任何投影后,您(可以理解)无法将该查询转换为数据视图 很难相信每个使用DataView的人都会遇到这个问题。有没有办法重写我的表单控件

我有很多地方需要将表单控件直接绑定到支持数据库。我正在使用LINQtoDataSet来实现这一点

例如,我有一个组合框,其中包含由数据库查询填充的条目。当然,问题是我的所有数据都使用数字ID,我需要进行表查询,将其转换为用户可读的选项

通常我会加入第二个表,并使用combobox DisplayMember指向用户可读的字符串列。这不起作用,因为在查询上使用联接或任何投影后,您(可以理解)无法将该查询转换为数据视图


很难相信每个使用DataView的人都会遇到这个问题。有没有办法重写我的表单控件的行为,使它们显示其值的函数?比如,如果它们的值是v,那么它们会显示一些方法(v)?

我有一个非常简单的方法来处理这些事情-如果它不能很好地发挥作用,就发明一个视图模型,即一个对象布局,旨在使您的域模型和UI之间的映射一帆风顺。这还可以鼓励您以视图模型而不是域模型的正确形状填充数据;这通常在减少获取的列数(有时是行数)和(可能更重要的是)避免多次访问数据库(通过一次命中以正确的形状获取正确的数据)方面有相当大的节省


从视图模型中,您可以使用简单的数据绑定技术,因为您想要的数据现在可以作为视图模型上的一级值直接使用。

我不相信您试图通过DisplayMember实现的目标是可能的。这是一个属性,它就是这样设计的。然而,还有一些其他的方法来实现你想要的

1) 您可以连接到组合框的事件。这是将数据绑定项更改为可供显示的可读项的理想位置,这正是您想要的

2) 您可以改为使用LINQ to SQL类,并重写分部类中的.ToString()部分,以按照您的需要显示数据。当您将数据绑定到LINQ to SQL对象时,组合框将显示该对象的字符串值


因为您已经在使用LINQ to DataSet,所以我只需要连接到Format事件。

当绑定到ComboBox时,您应该能够使用DisplayMember,我知道我可以。执行此操作时会出现什么异常?是否将LINQ to Classes对象与DataContext一起使用?您当前如何尝试数据绑定?(你能展示一些代码吗?@Jethro:我希望DisplayMember是一个方法,而不仅仅是一个属性。@danderson:不,我正在使用LINQ来创建数据集。我已经用数据库DataAdapterLINQ to SQL上的Fill方法填充了数据集。仅供参考,LINQ to SQL是填充LINQ to数据集的一种方法感谢您详细介绍了如何填充DS。(见我的答案)