嵌套的listview数据绑定 - 找不到属性?

时间:2009-04-24 18:16:17

标签: asp.net linq-to-sql data-binding listview

我有一个listview,我在代码隐藏中设置数据源 - 这很好用。 当我将另一个listview(或数据绑定控件)添加到listview的itemtemplate,并在代码隐藏中为该控件设置数据源时,查询返回的字段似乎对嵌套列表视图不可用; ASP.NET抛出以下错误:DataBinding:'System.String'不包含名为'j_Name'的属性。

在下面的示例中,d_Description工作正常,而j_Role会抛出上面指出的错误。我可以看到查询返回的数据,我知道列名匹配,导致错误的原因是什么(以及如何解决)?

ASPX页面

<asp:ListView ID="LV1" runat="server">
    <LayoutTemplate>
        <table runat="server" id="tblSummary">
            <tr runat="server" id="itemPlaceholder" />
        </table>
    </LayoutTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <%#Eval("d_Description")%>
            </td>
        </tr>
        <tr>
            <td>
                <asp:ListView ID="LV2" runat="server">
                    <ItemTemplate>
                        <%#Eval("j_Role")%>
                    </ItemTemplate>
                    <LayoutTemplate>
                        <asp:placeholder id="itemPlaceholder" runat="server" />
                    </LayoutTemplate>
                </asp:ListView>
            </td>
        </tr>
    </ItemTemplate>
</asp:ListView>

代码背后

var qry1 = from q in context.Descriptions select q.d_Description;
LV1.DataSource = qualificationQry;
LV1.DataBind(); 

var qry2 = from q in context.Roles select q.j_Role;
LV2.DataSource = qualificationQry;
LV2.DataBind(); 

修改 我已经将类似于下面的代码添加到外部listview的ItemDataBound事件中,并且我仍然遇到相同的错误。据推测,我误解了指导员?

protected void LV_ItemDataBound(object sender, ListViewItemEventArgs e)
{
    using (dbDataContext context = new dbDataContext()
    {
        var qry2 = from q in context.Roles select q.j_Role;

        ListView tempLV = (ListView)e.Item.FindControl("LV2");
        tempLV.DataSource = qry2;
        tempLV.DataBind();
    }
}

编辑:2 在网上阅读了更多内容(现在我已经知道要搜索什么),建议的答案似乎是正确的 - 然而,它不起作用 - 有人可以建议为什么吗?

编辑:3 如果我抛弃了j_Name的输出,并且只有一个硬编码的字符串,则没有错误,并且硬编码的字符串输出预期的次数。这表明它只是列名(j_Name)是错误的 - 即使我可以看到具有该确切列名的查询返回的数据集。

编辑:4 固定它。 这是错的     var qry2 = from q in context.Roles select q.j_Role; 这是对的     var qry2 = from q in context.Roles select q;

1 个答案:

答案 0 :(得分:2)

您需要在外部列表的ItemDataBoundEvent中将外部列表的每一行上的内部列表绑定。

所以这段代码:

var qry2 = from q in context.Roles select q.j_Role;
LV2.DataSource = qualificationQry;
LV2.DataBind();

将需要进入外部列表ItemDataBound事件的偶数处理程序:

protected void ContactsListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
  if (e.Item.ItemType == ListViewItemType.DataItem)
  {
    // Bind the inner list on every repeat of the outer list
    var qry2 = from q in context.Roles select q.j_Role;
    LV2.DataSource = qualificationQry;
    LV2.DataBind();
  }
}

并且可能您希望根据外部列表的当前项中的值过滤内部列表的值