我无法弄清楚如何将自定义IList绑定到gridview。 IList包含另一个自定义IList。我需要将此IList中的属性绑定到gridview。
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中的“Name”字段。欢迎所有建议。
答案 0 :(得分:0)
你试过吗,
Attendees.Name
修改强> 与会者本身就是IEnumerable。以上建议仅适用于Attendee.Name
如果您不想显示所有参与者,您需要制作模板字段,并可能使用转发器或其他东西......如:
<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>
答案 1 :(得分:0)
Johan的回答很好,特别是关于你如何尝试将一个集合绑定到一个期望可以转换为字符串的列的部分。
另一种选择是放置一个TemplateField,它包含您选择使用的可绑定控件(Repeater,另一个GridView等),并将DataSource属性绑定到业务对象的Attendees属性。
另外,如果您与使用GridView的想法结合在一起,我不会这样做,但在这些需要更多布局控制的情况下,我建议使用新的ListView(.NET 3.5)控件,或者最近我一直在使用嵌套中继器,所以我可以对我想要生成的布局进行更精细的控制。
希望这有帮助。
答案 2 :(得分: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