C# Winforms Bindingsource Datamember属性接口不显示任何内容
设置:C# Winforms Bindingsource Datamember属性接口不显示任何内容,c#,.net,winforms,C#,.net,Winforms,设置: 使用一个属性初始化Model,该属性的类型是接口 创建实例并将其添加到winforms bindingsource 向winforms添加文本框,并将文本值配置为使用bindingsource和属性作为datamember 模型 装订 问题 当我运行此代码时,文本框保持为空(而不是显示客户的名称) 但当我将模型中Customer属性的类型更改为具体的Customer类型时,它确实显示了这一点 我在MSDN上找不到任何原因为什么会这样?有什么想法吗 (最好没有像将toString值存储
- 使用一个属性初始化
,该属性的类型是接口Model
- 创建实例并将其添加到winforms bindingsource
- 向winforms添加文本框,并将文本值配置为使用bindingsource和属性作为datamember
(最好没有像将toString值存储到另一个属性中这样的解决方法,有一个框架执行此绑定,我不想侵入)可能您应该指定绑定到TextBox文本属性的属性
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding
("Text", this.bsModel, "Customer.Name", true));
如果删除接口ICCustomer并直接使用具体类Customer,那么绑定代码将使用您在具体类中重写的始终存在的ToString()方法,从而获得文本框集。例如,尝试更改ToString以返回一个姓氏属性将属性设置为
false
将其修复,使其使用具体实现中的ToString()
方法
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsModel, "Customer", false));
问题:
我刚刚浏览了msdn上的内容,突然发现了下面这行内容:
if (e.Value != null && (e.Value.GetType().IsSubclassOf(type) || e.Value.GetType() == type || e.Value is System.DBNull))
return e.Value;
根据:
IsSubclassOf方法不能用于确定接口是否派生自另一个接口,或者类是否实现接口
因此,这将计算为false
,进一步的转换将返回null
。
通过设置为false,将不会调用parse方法,而只返回值
不确定这是故意的还是一个bug。但是我觉得对于具体类型,我最好将formattingEnabled
设置为false
@史蒂夫的解决方案也很有效!(谢谢) 但他正在研究接口类型
我只是更喜欢简单地使用
toString()
,因为它可以随着时间的推移而改变,而且维护起来更容易。太好了,这对name很有用。但是当它是一个接口时,为什么不能使用toString方法呢。因为它是一个实例,所以toString总是在某个地方可用?(如果可能的话,我仍然更喜欢使用toString,因为它已经存在于所有要显示的类中)我找到了根本原因,尽管不确定它是否是故意的。无论如何,谢谢你。
this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bsModel, "Customer", false));
if (e.Value != null && (e.Value.GetType().IsSubclassOf(type) || e.Value.GetType() == type || e.Value is System.DBNull))
return e.Value;