2014-09-30 30 views
1

我想了解如何在firstLevelGrid內添加額外的嵌套表,但我沒有成功。任何幫助,將不勝感激。 特別是當我在標記和代碼背後創建第二級網格時,我在管理OnRowDataBound方面做了一些錯誤。試圖添加沒有成功的二級嵌套表

這是我生成網格和第一級的代碼。爲了避免弄亂代碼,我沒有添加二級網格的嘗試。 這不是作業,我不是專業的編碼員,我是一個自學者。

<div> 
     <asp:GridView ID="zeroLevelGrid" runat="server" AutoGenerateColumns="false" CssClass="Grid" 
      DataKeyNames="Code" OnRowDataBound="OnRowDataBoundZeroLevel"> 
      <Columns> 
       <asp:TemplateField> 
        <ItemTemplate> 
         <img alt="" style="cursor: pointer" src="images/plus.png" /> 
         <asp:Panel ID="firstLevelPanel" runat="server" Style="display: none"> 
          <asp:GridView ID="firstLevelGrid" runat="server" AutoGenerateColumns="false" CssClass="ChildGrid"> 
           <Columns> 
<!-- Here is where I add the second level grid copying the entire block "TemplateFiled" of the firstLevelGrid and renaming it secondLevel...--> 
            <asp:BoundField ItemStyle-Width="150px" DataField="Id" HeaderText="Id" /> 
            <asp:BoundField ItemStyle-Width="150px" DataField="Code" HeaderText="Code" /> 
            <asp:BoundField ItemStyle-Width="150px" DataField="Description" HeaderText="Description" /> 
            <asp:BoundField ItemStyle-Width="150px" DataField="Quantity" HeaderText="Quantity" /> 
           </Columns> 
          </asp:GridView> 
         </asp:Panel> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField ItemStyle-Width="150px" DataField="Id" HeaderText="Id" /> 
       <asp:BoundField ItemStyle-Width="150px" DataField="Code" HeaderText="Code" /> 
       <asp:BoundField ItemStyle-Width="150px" DataField="Description" HeaderText="Description" /> 
       <asp:BoundField ItemStyle-Width="150px" DataField="Quantity" HeaderText="Quantity" /> 
      </Columns> 
     </asp:GridView> 

,我的C#代碼:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     zeroLevelGrid.DataSource = GetData("select top 10 * from Table_xx");//top10 only for test purposes 
     zeroLevelGrid.DataBind(); 
    } 
} 

private static DataTable GetData(string query) 
{ 
    string strConnString = ConfigurationManager.ConnectionStrings["Test1ConnectionString"].ConnectionString; 
    using (SqlConnection con = new SqlConnection(strConnString)) 
    { 
     using (SqlCommand cmd = new SqlCommand()) 
     { 
      cmd.CommandText = query; 
      using (SqlDataAdapter sda = new SqlDataAdapter()) 
      { 
       cmd.Connection = con; 
       sda.SelectCommand = cmd; 
       using (DataSet ds = new DataSet()) 
       { 
        DataTable dt = new DataTable(); 
        sda.Fill(dt); 
        return dt; 
       } 
      } 
     } 
    } 
} 

protected void OnRowDataBoundZeroLevel(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     string code = zeroLevelGrid.DataKeys[e.Row.RowIndex].Value.ToString(); 
     GridView firstLevelGrid = e.Row.FindControl("firstLevelGrid") as GridView; 
     firstLevelGrid.DataSource = GetData(string.Format("IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'{0}')) SELECT * from [{0}]", code)); 
     firstLevelGrid.DataBind(); 
    } 
    } 
    //here is where I add an OnRowDataBound event copying the above one as OnRowDataBoundFirstLevel 
    //but then I get lost... 
} 

我會很高興,如果有人能指出我如何添加firstLevelGrid等同於它的內部網格嵌套的級別。我很樂意提供賞金來獲得這個權利,但不幸的是我沒有足夠的代表。萬分感謝。

回答

1

Similart您firstLevelGrid,你必須聲明firstLevelGrid內的第三級網格作爲一個模板列

<asp:TemplateField> 
    <ItemTemplate> 
     <asp:GridView ID="secondLevelGrid" runat="server" AutoGenerateColumns="false" CssClass="ChildGrid"> 
        <Columns> 
         <%--Your columns go here--%> 
         </Columns> 
      </asp:GridView> 
    </ItemTemplate> 
</asp:TemplateField> 

那麼對於firstLevelGrid

OnRowDataBound="firstLevelGrid_OnRowDataBound" 

處理OnRowDataBound事件在RowDataBound事件你可以獲取網格視圖,數據密鑰並綁定子網格

protected void firstLevelGrid_OnRowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     GridView firstLevelGrid = e.Row.NamingContainer as GridView; 
     string code = firstLevelGrid.DataKeys[e.Row.RowIndex].Value.ToString(); 
     GridView secondLevelGridView = e.Row.FindControl("secondLevelGrid") as GridView; 
     secondLevelGridView.DataSource = //GetData 
     secondLevelGridView.DataBind(); 
    } 
} 
+0

Kiran,非常感謝。我遵循上面的示例。我得到了一個錯誤,我修復了在firstLevelGrid下添加DataKeyNames =「Code」的問題。你回答了我的問題。我理解了這個問題。再次感謝。 – user3855329 2014-09-30 07:23:42