2

我有一个 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>

但是有没有更简单的方法来做到这一点?这只显示文本,不允许我编辑它......如果我可以将它作为一个理想的边界域。

4

2 回答 2

2

要在标签中获得有意义的内容,您可以将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)绑定以在数据源和网格之间进行双向通信,您可能会遇到问题。可能它不会工作。请参阅此相关问题和答案:

一个带有 EntityDataSource 的 ASP.NET GridView 中两个相关数据库表的列

于 2011-04-04T15:13:05.990 回答
0

几年前有人问过这个问题,但我发现寻找相同的答案。这对我有用。在 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>

请注意,如果您使用向导创建实体模型,默认情况下,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();
    }
}
于 2015-04-16T23:07:59.253 回答