2014-03-07 112 views
0

我有一个ASP.NET GridView,其中值绑定到其中一列的ID。在GridView中嵌套ListView

此表的另一个列应包含项目列表,应通过从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,所以我可以将L项目是?

回答

0

附上“OnRowDataBound”事件到GridView控件检索项对于GridView上每行的ListView(在GridView绑定之后):

eg在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(); 
} 

(如将是适当的,我试过编辑蒂尼西亚诺的职位对他的回答阐述的事件连接到GridView和获取请求ID,但是SO编辑正在拒绝它,没有很好的理由。上面的代码经过测试并完全回答了问题)。

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();