Связывание Gridview с IList <BusinessObject>, который содержит IList <BusinessObject> - PullRequest
1 голос
/ 09 июня 2009

У меня проблемы с выяснением, как связать пользовательский IList с сеткой. IList содержит другой пользовательский IList. Мне нужно привязать свойство из этого IList к сетке.

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; } }
}

Backend 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>

Проблема заключается в заполнении поля «Имя» в виде сетки. Все предложения приветствуются.

Ответы [ 3 ]

0 голосов
/ 09 июня 2009

Хороший ответ Йохана, особенно о том, как вы пытаетесь связать коллекцию со столбцом, который ожидает что-то, что может быть преобразовано в строку.

Другой вариант - поместить TemplateField, который содержит привязываемый элемент управления (Repeater, другой GridView и т. Д.), Который вы решите использовать, и привязать свойство DataSource к свойству Attendees вашего бизнес-объекта.

Кроме того, я не согласен, если вы женаты на идее использования GridView, но в подобных случаях, когда вам требуется больше элементов управления макетом, я бы предложил новый элемент управления ListView (.NET 3.5), или В последнее время я только что использовал вложенные повторители, чтобы у меня был более точный контроль над макетом, который я пытаюсь сгенерировать.

Надеюсь, это поможет.

0 голосов
/ 09 июня 2009

Я предполагаю, что вы хотите выровнять иерархию и отобразить по одной строке для каждого пользователя. Если у вас есть доступ к 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 голосов
/ 09 июня 2009

Вы пробовали,

Attendees.Name

Edit: Участники сам по себе 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...