2016-01-26 5 views
0

У меня есть RowDataBound, который обрабатывает каждую запись и выполняет запрос с OrderId для получения подробных данных. Затем его значения привязаны к вложенному GridView с именем gvOrders. Проблема, с которой я сталкиваюсь, заключается в том, что я получаю только результаты последнего значения OrderId цикла, связанного с gvOrders GridView. Может ли кто-нибудь помочь мне получить результаты всех циклов в GridView gvOrders? Кажется, проблема связана с моим методом привязки.RowDataBound, не отображающий все строки в GridView

Protected Sub GridViewDetailInfo_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridViewDetailInfo.RowDataBound 

    Dim strSQL As String 

    If e.Row.RowType = DataControlRowType.DataRow Then 

     Dim OrderId As String = e.Row.Cells(1).Text 
     Dim gvOrders As GridView = DirectCast(e.Row.FindControl("gvOrders"), GridView) 

     strSQL = "select Qty, Prod, Date from Order..orders where OrderNo='" + OrderId + "'" 

     Me.SqlDataSourceDetail_Child.SelectCommand = strSQL 
     gvOrders.DataBind() 

    End If 

End Sub 

ответ

1

Вы используете один и тот же SqlDataSource (SqlDataSourceDetail_Child) для всех ваших детей GridViews. Поэтому, когда он наконец добирается до последнего OrderId, вы устанавливаете SelectCommandобщийSqlDataSource и теперь все дочерние GridViews получают одинаковый общий набор данных.

Чтобы обойти это, каждому ребенку GridView понадобится собственный источник данных. Вы можете продолжить свой путь и создать отдельный файл SqlDataSource для каждого из дочерних GridViews, но я предполагаю, что количество дочерних GridView не является постоянным. В этом случае вам нужно будет избавиться от дочернего SqlDataSource и привязать источник данных, такой как DataTable, к каждому дочернему GridView.

Это должно, по крайней мере направить вас в правильном направлении:

Protected Sub GridViewDetailInfo_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridViewDetailInfo.RowDataBound 

    Dim strSQL As String 

    If e.Row.RowType = DataControlRowType.DataRow Then 
     Dim OrderId As String = e.Row.Cells(1).Text 
     Dim gvOrders As GridView = DirectCast(e.Row.FindControl("gvOrders"), GridView) 

     strSQL = "select Qty, Prod, Date from Order..orders where OrderNo='" + OrderId + "'" 

     gvOrders.DataSource = FunctionToRetrieveData(strSQL) 
     gvOrders.DataBind() 

    End If 

End Sub 

Также обратите внимание, что вы открыты для SQL injection. Предлагаю посмотреть на parameterized queries.

Смежные вопросы