2012-10-08 47 views
1

我们希望显示在GridView供应商和每个显示的产品的产品的项目符号列表。Datasource需要链接供应商与每个供应商的产品

例如:

Supplier One    Product A 
          Product B 

Supplier Two    Product A 
          Product B 
          Product C 

这是在GridView的样子:

 <asp:GridView 
      ID="GridView1" 
      runat="server" 
      AutoGenerateColumns="False" 
      CssClass="DataWebControlStyle"> 

      <HeaderStyle CssClass="HeaderStyle" /> 

      <AlternatingRowStyle CssClass="AlternatingRowStyle" /> 

      <Columns> 
       <asp:BoundField 
        DataField="CompanyName" 
        HeaderText="Supplier" /> 

       <asp:TemplateField HeaderText="Products"> 
        <ItemTemplate> 
         <asp:BulletedList 
          ID="BulletedList1" 
          runat="server" 
          DataSource='<%# %>' 
          DataTextField="ProductName"> 
         </asp:BulletedList> 
        </ItemTemplate> 
       </asp:TemplateField> 
      </Columns> 
     </asp:GridView> 

这是代码隐藏文件中的数据加载到GridView控件:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    Dim suppliersAdapter As New SuppliersTableAdapter 

    GridView1.DataSource = suppliersAdapter.GetSuppliers() 
    GridView1.DataBind() 
End Sub 

你可以告诉我们在asp:BulletedList DataSouce中放置什么,这样产品也能显示出来吗?

*更新*

感谢大家的帮助。我删除了DataSource ='<%#%>'这一行,这里是基于你在代码隐藏文件中的帮助,现在的额外工作编码。

因为我在学习ASP.Net,所以我在代码中添加了很多注释,以帮助我了解正在发生的事情以及是什么使它发生变化。如果我在评论中犯了错误,请调整评论。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    ' TableAdapter object. 
    ' Provide communication between this application and the database. 
    '----------------------------------------------------------------- 
    Dim suppliersAdapter As New SuppliersTableAdapter 

    ' Get the data from the TableAdapter into the GridView. 
    '------------------------------------------------------ 
    GridView1.DataSource = suppliersAdapter.GetSuppliers() 

    ' Display the result set from the TableAdapter in the GridView. 
    '-------------------------------------------------------------- 
    GridView1.DataBind() 
End Sub 

Protected Sub GridView1_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GridView1.RowDataBound 

    ' A GridView has DataRows, EmptyDataRows, Footers, Headers, Pagers, and Separators. 
    ' The DataSource will be assigned to the BulletedList in this GridView only when the RowType is a DataRow. 
    ' This will make sure the "Object reference not set to an instance of an object" error will not be thrown. 
    '--------------------------------------------------------------------------------------------------------- 
    If e.Row.RowType = DataControlRowType.DataRow Then 

     ' TableAdapter object. 
     ' Provide communication between this application and the database. 
     '----------------------------------------------------------------- 
     Dim productsAdapter As New ProductsTableAdapter 

     ' BulletedList object. 
     ' This object is created from the BulletedList control in the aspx file for GridView 
     ' so it can be used to assign a DataSource to the BulletedList. 
     '------------------------------------------------------------------------------------ 
     Dim BulletedList1 As BulletedList = DirectCast(e.Row.FindControl("BulletedList1"), BulletedList) 

     ' Get the SupplierID into a variable for use as a parameter for the GetProductsBySupplierID method of the TableAdapter. 
     '---------------------------------------------------------------------------------------------------------------------- 
     Dim supplier = DataBinder.Eval(e.Row.DataItem, "SupplierID") 

     ' Get the data from the TableAdapter into the GridView. 
     '------------------------------------------------------ 
     BulletedList1.DataSource = productsAdapter.GetProductsBySupplierID(supplier) 

     ' Display the result set from the TableAdapter in the GridView. 
     '-------------------------------------------------------------- 
     BulletedList1.DataBind() 
    End If 
End Sub 

回答

1

你必须为每个列表不同的数据源。

你可以通过在网格的RowDataBound事件上设置BulletedList上的数据源来实现你的目标。

附上RowDataBound事件处理程序如下:

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType==DataControlRowType.DataRow) 
    {  
     BulletedList BulletedList1 = (BulletedList)e.Row.FindControl("BulletedList1"); 
     var supplier = DataBinder.Eval(e.Row.DataItem, "CompanyName"); 
     BulletedList1.DataSource = GetProductListForSupplier(supplier); 
     BulletedList1.DataBind(); 
    } 
} 
+0

感谢大家的帮助。 :-)我根据你的帮助更新了我的帖子。 –

0

试试这个

protected void GridView1_RowDataBound(Object sender, GridViewRowEventArgs e) 
    { 

    if(e.Row.RowType == DataControlRowType.DataRow) 
    { 
     // Display the company name in italics. 
     string supplierName = e.Row.Cells[0].Text; 
     //OR assuming you stored the SupplierID in hidden view - this can also be retrieved from GridView DataKeys value for each row 
     string supplierID = ((HiddenField) e.Row.FindControl("hiddenFieldSupplierID")).Value; 

     DataTable products = getProductsBySupplier(supplierID); //or by SupplierName 
     BulletedList BulletedList1 = ((BulletedList) e.Row.FindControl("BulletedList1")) 
     BulletedList1.DataSource = products; 
     BulletedList1.DataBind()  

    } 

    }