Источник данных, необходимый для связи поставщика с продуктами для каждого поставщика
Мы хотели бы отобразить в поставщиках GridView и маркированный список продуктов для каждого из продуктов, которые отображаются.
Например:
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 = '<% #%>', и теперь добавлена дополнительная рабочая кодировка, основанная на вашей помощи в файле code-behind.
Так как я изучаю 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
2 ответа
У вас есть разные источники данных для каждого списка.
Вы можете достичь того, что вы, установив источник данных на BulletedList
на событие RowDataBound сетки.
Прикрепить 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();
}
}
Попробуй это
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()
}
}