将ListView嵌套在GridView中

时间:2014-03-07 17:09:13

标签: c# asp.net listview gridview

我有一个ASP.NET GridView,其中的值将ID绑定到其中一列。

此表的另一列应包含项列表,应通过从GridView传入ID来解析。

为实现这一点,我尝试将ListView嵌套在GridView中,并将ID传递给ListView使用的ObjectDataSource的默认参数,但不允许使用此语法:

                                                

    <asp:TemplateField HeaderText="columnItems">
        <ItemTemplate>
            <asp:ListView ID="listOfItems" runat="server" DataSourceID="MyObjectDataSource >
                <ItemTemplate>
                    <asp:LinkButton ID="MyLinkButton" Runat="Server" Text='item'></asp:LinkButton>
                </ItemTemplate>
            </asp:ListView>
            <asp:ObjectDataSource ID="MyObjectDataSource" runat="server"   
                TypeName="MyTypeName.Whatever" SelectMethod="GetItems">
                <SelectParameters>
                    <asp:Parameter Name="requestId" Type="String" DefaultValue='<%# Eval("ID")'/>
                </SelectParameters>
            </asp:ObjectDataSource>
        </ItemTemplate>
    </asp:TemplateField>
</Columns>

那么我该如何传递ID以便获取项目列表?

2 个答案:

答案 0 :(得分:2)

您可能需要在RowDataBound事件中执行此操作,在那里获取ID,然后执行DB 然后做一些像

这样的事情
if(e.Row.RowType != DataControlRowType.DataRow)
{
    return;
}

ListView a = (ListView)e.Row.FindControl("listOfItems");
a.datasource = // the result of your db call
a.databind();

答案 1 :(得分:0)

将一个'OnRowDataBound'事件附加到GridView控件,以便为GridView上的每一行检索ListView的项目(在绑定GridView之后):

e.g。在ASPX页面上:

<asp:GridView id="MyGridView" OnRowDataBound="GetItems" ... > ... </asp:GridView>

在代码隐藏中:

protected void GetItems(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType != DataControlRowType.DataRow)
    {
        return;
    }

    // Get the ID from the GridView
    var dataRowView = (DataRowView) e.Row.DataItem;
    var id = dataRowView["ID"].ToString();

    // Bind the supporting documents to the ListView control
    var listView = (ListView) e.Row.FindControl("listOfItems");
    listView.DataSource = /* Call to database to return a DataSet of items */;
    listView.DataBind();
}

(在适当的情况下,我尝试编辑Tunisiano的帖子,详细阐述他将事件附加到GridView并获取请求ID的答案,但是SO编辑们没有充分的理由拒绝它。上面的代码经过测试和答案问题确切)。