2012-01-26 2 views
0

Я пытаюсь вложить один gridview в другой, но я не могу получить данные для заполнения во втором представлении сетки. Я получаю ошибку при попытке установить источник данных второй сетки данных (говоря, что она равна нулю). Может ли кто-нибудь помочь? Вот страница ASPX:Проблемы с вложенными GridView

<div id="divSource" runat="server" align="center"> 
<asp:GridView ID="Source" runat="server" AutoGenerateColumns="False" DataKeyNames="sourceLineItem" CSSClass="viewSourceGrid" OnRowDataBound="PopulateDateCodes"> 
    <Columns> 
     <asp:TemplateField InsertVisible="False" HeaderStyle-Width="70px"> 
      <ItemTemplate> 
       <asp:Label CssClass="sourceHeader" runat="server" Text= '<%# "Source: " + (Container.DataItemIndex + 1).ToString() %>'> </asp:Label> 
      </ItemTemplate> 
     </asp:TemplateField> 
     <asp:BoundField DataField="nfdBroker" HeaderText="NFD/Broker" InsertVisible="False" ReadOnly="True" SortExpression="nfdBroker" /> 
     <asp:BoundField DataField="locationDescription" HeaderText="Material Location" SortExpression="materialLocation" /> 
     <asp:BoundField DataField="origPkg" HeaderText="Original Packaging?" SortExpression="origPkg" /> 
     <asp:BoundField DataField="oemCC" HeaderText="OEM C of C? " InsertVisible="False" ReadOnly="True" SortExpression="oemCC" /> 
     <asp:BoundField DataField="minBuyQty" HeaderText="Minimum Buy Qty" SortExpression="minBuyQty" /> 
     <asp:BoundField DataField="deliveryInfo" HeaderText="Delivery" SortExpression="delUOM" /> 

     <asp:TemplateField InsertVisible="False" HeaderText="Date Codes" > 
      <ItemTemplate>    
       <asp:GridView ID="DateCodeGrid" runat="server" InsertVisible="False" DataKeyNames="dateCode" CSSClass="viewSourceGrid" > 
        <Columns> 
         <asp:BoundField DataField="dateCode" SortExpression="dateCode"> 
          <ItemStyle Width="20%" /> 
         </asp:BoundField> 
        </Columns> 
       </asp:GridView> 
      </ItemTemplate> 
     </asp:TemplateField> 

    </Columns> 
</asp:GridView> 

, а затем вот код позади:

public partial class Controls_ViewSource : System.Web.UI.UserControl 
{ 
    //Set the Source Line Item 
    public int SourceLineItem { get; set; } 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     this.SourceLineItem = SourceLineItem; 
     RequestDB db = new RequestDB(); 
     DataSet sources = db.GetSource(int.Parse(Request.QueryString["requestNumber"]), SourceLineItem); 
     Source.DataSource = sources; 
     Source.DataBind(); 

    } 

    protected void PopulateDateCodes(object sender, GridViewRowEventArgs e) 
    { 
     RequestDB db = new RequestDB(); 
     int index = e.Row.RowIndex; 
     GridView gv = (GridView)Source.Rows[0].FindControl("DateCodeGrid"); 
     //int sourceLineItem = int.Parse(Source.DataKeyNames[0].ToString()); 
     //Response.Write(Source.DataKeyNames[0].ToString()); 
     DataSet dateCodes = db.GetDateCodes(71); 
     gv.DataSource = dateCodes; 
     gv.DataBind(); 

    } 
} 
+0

Можете ли вы показать нам также код для 'db.GetDateCodes'? Я подозреваю, что вы не связываетесь со своими вложенными данными. –

+0

Кроме того, ваш код популяции GV странный. Похоже, вы не заполняете gridview, а только первое вложенное gridview внутри первой строки? Внешний вид сетки должен сначала быть привязан к базе данных. –

ответ

3

Вы должны были бы найти вложенный вид сетки в строке, что представляют собой данные границы :

GridViewRow row = e.Row; 

Необходимо убедиться, что вы делаете это только для строк данных, а не строки верхнего или нижнего колонтитула:

if(row.RowType == DataControlRowType.DataRow) 
{ 
    // Find the nested grid view 
    GridView nested = (GridView)row.FindControl("DateCodeGrid"); 

    // The rest of your code for binding the nested grid view follows here 
} 
+0

Удивительно, что сработало. Благодаря! – shawleigh17

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