我正在处理一个包含子对象的对象(参见下面的示例)。我试图将List<rootClass>
绑定到datagrid。当我绑定List<>
时,在包含subObject
的单元格中,我看到以下值... "namespace.subObject" ...
正确显示字符串值。
理想情况下,我希望在datacell中看到subObject
的“描述”属性。如何映射要在datacell中显示的subObject.Description
?
public class subObject
{
int id;
string description;
public string Description
{ get { return description; } }
}
public class rootClass
{
string value1;
subObject value2;
string value3;
public string Value1
{ get { return value1; } }
public subObject Value2
{ get { return value2; } }
public string Value3
{ get { return value3; } }
}
答案 0 :(得分:9)
如果我没弄错,它会在你的subObject上显示调用.ToString()的结果,所以你可以覆盖它以返回Description的内容。
您是否尝试过绑定到Value1.Description? (我猜它不起作用)。
我有一个可以在绑定时使用而不是List的类,它将处理这个,它实现了ITypedList,它允许集合为其对象提供更多“属性”,包括计算属性。
我的文件的最后一个版本在这里:
https://gist.github.com/lassevk/64ecea836116882a5d59b0f235858044
使用:
List<rootClass> yourList = ...
TypedListWrapper<rootClass> bindableList = new TypedListWrapper<rootClass>(yourList);
bindableList.BindableProperties = "Value1;Value2.Description;Value3.Description";
gridView1.DataSource = bindableList;
基本上,您绑定到TypedList<T>
的实例而不是List<T>
,并调整BindableProperties属性。我的工作有一些变化,包括一个只是自动构建BindableProperties,但它还没有在主干中。
您还可以添加计算属性,如下所示:
yourList.AddCalculatedProperty<Int32>("DescriptionLength",
delegate(rootClass rc)
{
return rc.Value2.Description.Length;
});
或使用.NET 3.5:
yourList.AddCalculatedProperty<Int32>("DescriptionLength",
rc => rc.Value2.Description.Length);
答案 1 :(得分:9)
由于你提到DataGridViewColumn
(标签),我认为你的意思是winforms。
访问子属性是一件痛苦的事;货币管理器绑定到列表,因此您默认只能访问直接属性;但是,如果你绝对需要使用自定义类型描述符,你可以通过这个。您还需要使用其他标记,例如“Foo_Bar”而不是“Foo.Bar”。但是,这是一项需要PropertyDescriptor
,ICustomTypeDescriptor
和TypeDescriptionProvider
知识的主要工作量,而且几乎肯定不值得,
最简单的解决方法是将属性公开为shim / pass-thru:
public string Value2Description {
get {return Value2.Description;} // maybe a null check too
}
然后绑定到“Value2Description”等。
答案 2 :(得分:3)
我不确定您是否使用ASP.NET,但如果是,则可以使用模板列和Eval()方法显示嵌套对象的值。例如。显示subObject的Description属性:
<asp:GridView ID="grid" runat="server" AutoGenerateColumns="true">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Literal Text='<%# Eval("Value2.Description") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
答案 3 :(得分:1)
不确定你是否会这样......
您可以编写如下方法:
protected string getSubObject(object o)
{
string result = string.empty;
try
{
result = ((subObject)o).Description;
}
catch
{ /*Do something here to handle/log your exception*/ }
return result;
}
然后绑定像这样的对象:
<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />