2009-06-09 99 views
1

我很难弄清楚如何将自定义IList绑定到gridview。 IList包含另一个定制IList。我需要将这个IList的属性绑定到gridview。Binding Gridview to IList <BusinessObject>包含IList <BusinessObject>

public class Seminar : BusinessObject 
{ 
    private string _description = String.Empty; 
    private List<User> _attendees; 

    public string Description {get {return _description;} set {_description = value;}} 
    public List<User> Attendees {get {return _attendees;} set {_attendees = value;}} 
} 

public class User : BusinessObject 
{ 
    private string _name = String.Empty; 
    public string Name { get { return _name; } set { _name = value; } } 
} 

后端page.aspx.cs:

List<Seminar> seminarList = SeminarManager.Get(id); 
gridSeminars.DataSource = seminarList; 
gridSeminars.DataBind(); 

前端page.aspx:

<asp:GridView ID="gridSeminars" runat="server"> 
<Columns> 
    <asp:BoundField DataField="Id" /> 
    <asp:BoundField DataField="Description" /> 
    <asp:BoundField DataField="Name" /> 
</Columns> 
</asp:GridView> 

的问题是在GridView填充 “名称” 字段。所有建议都欢迎。

+0

我用约翰的回答解决我的问题。 – Brian 2009-06-12 14:36:20

回答

0

你有没有试过,

Attendees.Name 

编辑: 与会者是一个IEnumerable本身。以上建议仅适用于Attendee.Name

如果你wan't显示你需要做一个模板列的所有与会者,也许使用一个中继器或东西...是这样的:

<asp:TemplateField> 
     <ItemTemplate> 
      <asp:Repeater runat="server" DataSource='<%# Eval("Attendees") %>'> 
       <ItemTemplate> 
        <tr> 
        <td> 
        Name 
        </td> 
        <td> 
         <%# Eval("Name")%> 
        </td> 
        </tr> 
       </ItemTemplate> 
      </asp:Repeater> 
     </ItemTemplate> 
    </asp:TemplateField> 
+0

由于它是IEnumerable类型,所以Attendees属性本身没有Name属性,但嵌套控件解决方案是一个很好的属性。 – 2009-06-09 15:40:06

0

约翰的答案是一个很好的答案,特别是关于如何将集合绑定到期望可以转换为字符串的列的部分。

另一种选择是放置包含可选绑定控件(Repeater,另一个GridView等)的TemplateField,并将DataSource属性绑定到业务对象的Attendees属性。另外,如果你已经使用GridView的想法结婚了,但是在像这些需要更多控制布局的情况下,我会建议使用新的ListView(.NET 3.5)控件,或者最近我刚刚使用嵌套式中继器,以便我可以更精确地控制我尝试生成的布局。

希望这会有所帮助。

0

我假设你想扁平化层次结构并为每个用户显示一行。如果你有机会到LINQ,您可以使用此:

List<Seminar> seminarList = SeminarManager.Get(id); 

gridSeminars.DataSource = from seminar in seminarList // loop through all of the seminars in the list 
          from user in seminar.Attendees // loop through all of the users in the current seminar 
          select new // create a new, flattened object to bind to. 
          { 
          seminar.Id, 
          seminar.Description, 
          user.Name 
          }; 

gridSeminars.DataBind(); 

http://weblogs.asp.net/zeeshanhirani/archive/2008/03/26/select-many-operator-part-1.aspx

+0

这看起来好像能够很快解决我的问题,但我一直遇到语法错误,它不会让我写出“来自用户在研讨会中的线路。出席者”。我需要弄清楚这个LINQ的东西! – Brian 2009-06-12 14:38:22