将列表<myobject>绑定到转发器</myobject>

时间:2011-08-05 10:29:21

标签: data-binding c#-4.0 repeater datarepeater

我有一个复杂的类,如:

    public class Person
    {
        public int Pid;
        IList<Address> Addressess;
        public Name Name;
        public Name PartnerName;

        Person(int id)
        {
            Addressess = new List<Address>();
        }
    }

    public class Address
    {
        public string HouseName;
        public string street;
        public string country;
        public string universe;
        public string galaxy;
    }

    public class Name
    {
        public string Firstname;
        public string Lastname;
        public string Fullname { get { return Firstname + " " + Lastname; } }
    }

所以,现在,当我像这样绑定转发器时:

rpPeople.DataSource = PeopleNearYou; //this is a List<Person>();

在实际的转发器中,我想展示细节。要访问Pid,我需要做的就是:

<%# Eval("Pid") %>

现在,我无法弄清楚如何在转发器中访问全名

<%# Eval("Fullname") %> //error, fullname not found

另外,我想只显示第一个地址 而我不能这样做

<%# Eval("Address").First().Universe %> //red, glarring error. can't figure out how

那么,我该如何展示这些东西?

非常感谢。

2 个答案:

答案 0 :(得分:3)

如果在绑定转发器时抓取所需的类成员,这将更加容易。

rpPeople.DataSource = PeopleNearYou.Select(r => new
      {
           Pid = r.Pid,
           Universe = r.Addressess.First().Universe,
           Fullname = r.Name.Fullname
      }

现在您需要在转发器中执行的操作是:

<%# Eval("Universe") %>
<%# Eval("Fullname") %>

答案 1 :(得分:0)

如果我遇到这样复杂的情况,我总是使用ItemDataBound事件,因为你可以获得更多的控制权。例如,在你的情况下,我会在项目模板中创建一个标签,将ItemDataBound绑定到类似于此的代码...

void rpt1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    ((Label)e.Item.FindControl("lblFullName")).Text = ((Person)e.Item.DataItem).FullName;
}

如果您有页眉/页脚行,也需要检查e.Item.Type。