将具有子对象的对象作为属性绑定到数据网格

时间:2009-01-02 15:44:55

标签: c# datagrid binding object datagridviewcolumn

我正在处理一个包含子对象的对象(参见下面的示例)。我试图将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; } }
}

4 个答案:

答案 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”。但是,这是一项需要PropertyDescriptorICustomTypeDescriptorTypeDescriptionProvider知识的主要工作量,而且几乎肯定不值得,

最简单的解决方法是将属性公开为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" />