Отображение свойств навигации в GridView с использованием EntityDataSource? - PullRequest
2 голосов
/ 04 апреля 2011

У меня есть EntityDataSource, который я сопоставил с сущностью Resident, которая включает два свойства навигации (Building1, Room1).Я настроил свой GridView на использование этого EntityDataSource и установил для свойства EntityDataSource Include Building1, Room1, чтобы он включал эти свойства навигации, и добавил эти столбцы в GridView.Когда я запускаю приложение вместо отображения соответствующего свойства навигации, оно показывает это: webHousingAdmin.Building Как я могу заставить его отображать фактическое значение?Код выглядит так для GridView:

        <asp:TemplateField>
            <ItemTemplate>
                <asp:Label ID="lbl1" runat="server" Text='<%# Bind("Building1") %>' />
            </ItemTemplate>
        </asp:TemplateField>

Я получил его для отображения фактического значения с помощью следующего кода:

            <asp:TemplateField HeaderText="Building">
            <ItemTemplate>
                <asp:Label ID="lblBuilding" Text='<%# Bind("Building1.building_name") %>' runat="server" />
            </ItemTemplate>
        </asp:TemplateField>

Но есть ли более простой способ сделать это?Это только отображает текст, не позволяет мне редактировать его ... если я могу сделать это как ограниченное поле, которое было бы идеально.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2011

Чтобы получить что-то значимое в вашем ярлыке, вы можете либо связать скалярное свойство вашего Building класса с Label ...

<asp:Label ID="lbl1" runat="server" Text='<%# Bind("Building1.Name") %>' />

... или вы можете перезаписать ToString()класса ...

public class Building
{
    public string Name { get; set; }
    public string AnotherText { get; set; }

    public override string ToString()
    {
        return string.Concat(Name, ", ", AnotherText); // or whatever you like
    }
}

Если вы связываете свойство с сеткой, которая является классом, механизм связывания вызовет ToString() - и это возвращает только полное имя класса (имя класса точки пространства пространства имен)если вы не переопределите ToString.Это объясняет, почему вы видите только webHousingAdmin.Building в вашем примере.

Редактировать

На самом деле не связано с этим вопросом: Но вы можете столкнуться с проблемами, если попытаетесь связать навигациюсвойства с Bind (и не только Eval) для двунаправленной связи между источником данных и сеткой.Возможно, это не сработает.См. Этот связанный вопрос и ответ:

Столбцы двух связанных таблиц базы данных в одном ASP.NET GridView с EntityDataSource

0 голосов
/ 17 апреля 2015

Это было задано несколько лет назад, но я нашел тот же ответ.Это то, что сработало для меня.В ASPX это полный GridView в соответствии с заявленной моделью:

<asp:EntityDataSource ID="dsResidents" runat="server"
        ConnectionString="name=connString"
        DefaultContainerName="dbContext"
        EntitySetName="Residents"
        Include="Building"
        EnableUpdate="true" />

    <asp:GridView ID="ResidentGrid" runat="server"
        DataSourceID="dsResidents"
        OnRowUpdating="ResidentsGrid_RowUpdating"
        AutoGenerateColumns="False">
        <Columns>
            <asp:CommandField ShowEditButton="True" />
            <asp:TemplateField Visible="false">
                <ItemTemplate>
                    <asp:Label ID="lblID"
                        Text='<%# Eval("residentId") %>'
                        runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Name">
                <ItemTemplate>
                    <asp:Label ID="lblName"
                        Text='<%# Eval("residentName") %>'
                        runat="server" />
                </ItemTemplate>
            <asp:TemplateField HeaderText="CountryCode">
                <ItemTemplate>
                    <asp:Label ID="lblCountryCode"
                        Text='<%# Eval("Building.number") %>'
                        runat="server" />
                </ItemTemplate>
                <EditItemTemplate>
                    <asp:EntityDataSource ID="dsBuildings" runat="server"
                        ConnectionString="name=connString"
                        DefaultContainerName="dbContext"
                        EntitySetName="Buildings" />

                    <asp:DropDownList ID="ddlBuilding"
                        DataSourceID="dsBuildings"
                        DataTextField="number"
                        DataValueField="id"
                        SelectedValue='<%# Eval("id") %>' <!-- I am not sure about this line -->
                        runat="server" />
                </EditItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

Обратите внимание, что если вы создаете Entity Model с помощью мастера, по умолчанию имя ConnectionString совпадает с именем DefaultContainerName.В классе поддержки добавьте обработчик событий для обновления строки сетки (OnRowUpdating):

protected void ResidentsGrid_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    // This is for retrieving the entity object for the resident selected
    Label idLabel = (Label)ResidentsGrid.Rows[e.RowIndex].Cells[1].FindControl("lblID");
    int residentId = int.Parse(idLabel.Text);

    // And this is for the building selected in the dropdown
    DropDownList ddl = (DropDownList)ResidentsGrid.Rows[e.RowIndex].Cells[4].FindControl("ddlBuilding");
    // I would like to say that the cell index is the column position but as I know it isn't

    using (dbContext ctx = new dbContext())
    {
        Resident resident = ctx.Residents
            .Where(res => res.residentId == residentId).First();

        Building selectedBuilding = ctx.Buildings
            .Where(bld => bld.id == ddl.SelectedItem.Value).First();

        resident.Building = selectedBuilding;

        ctx.SaveChanges();
    }
}
...