我有一个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以便获取项目列表?
答案 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编辑们没有充分的理由拒绝它。上面的代码经过测试和答案问题确切)。