8

我正在使用其中包含子对象的对象(请参见下面的示例)。我正在尝试将 a 绑定List<rootClass>到数据网格。List<>当我在包含 的单元格中绑定 时subObject,我看到以下值... "namespace.subObject" ...字符串值正确显示。

理想情况下,我希望看到数据单元中的“描述”属性subObject。如何映射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

4 回答 4

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”等。

于 2009-01-03T12:10:03.447 回答
8

如果我没记错的话,它会显示在您的子对象上调用 .ToString() 的结果,因此您可以覆盖它以返回描述的内容。

您是否尝试过仅绑定到 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);
于 2009-01-02T15:49:33.647 回答
3

我不确定您是否使用 ASP.NET,但如果是,那么您可以使用模板列和 Eval() 方法来显示嵌套对象的值。例如显示子对象的描述属性:

<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>
于 2009-01-02T17:27:10.173 回答
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" />
于 2011-08-24T14:18:30.523 回答