2012-02-15 16 views
0

私の2番目のグリッド( "StaffAppraisalGrid")のコントロールを取得する際に問題があります。コードを実行するたびにnullが表示されますGridView staffGrid =(GridView)SubmitAppraisalGrid.FindControl( "StaffAppraisalGrid"); 。何が問題なの?Gridview内のテンプレートgridviewの制御を見つける方法はありますか?

デザイン:

<asp:GridView ID="SubmitAppraisalGrid" runat="server" AutoGenerateColumns="False" ShowHeader="False" BorderWidth="0px"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <asp:Label ID="QuestionLbl" runat="server" Text='<%# Bind("Question")%>'></asp:Label> 
       <asp:GridView ID="StaffAppraisalGrid" runat="server" AutoGenerateColumns="False"> 
        <Columns> 
         <asp:BoundField DataField="StaffName"/> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:RadioButtonList ID="RadioList" runat="server" DataSource='<%# Bind("RadioButtonList")%>'> 
           </asp:RadioButtonList> 
          </ItemTemplate> 
         </asp:TemplateField> 
         <asp:TemplateField> 
          <ItemTemplate> 
           <asp:TextBox ID="RemarksTbx" runat="server" Text='<%# Bind("RemarkTbx")%>'></asp:TextBox> 
          </ItemTemplate> 
         </asp:TemplateField> 
        </Columns> 
       </asp:GridView> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

サンプルコード:

   ArrayList listofquestion= dbmanager.GetAllQuestion(); 

      ArrayList listofstaff = dbmanager.GetAllStaffName(); 
      DataTable dt = new DataTable(); 
      DataRow dr = null; 
      dt.Columns.Add(new DataColumn("Question", typeof(string))); 

      foreach (Question ques in listofquestion) 
      { 
       dr = dt.NewRow(); 
       dr["Question"] = "Q"+ques.QuestionID + ") " + ques.QuestionDetails+"?"; 
       dt.Rows.Add(dr); 
      } 

      ViewState["QuestionTable"] = dt; 

      //staffgrid 
      int index = 0; 
      for (int i = 0; i < dt.Rows.Count; i++) 
      { 
       DataTable staffdt = new DataTable(); 
       DataRow staffdr = null; 
       staffdt.Columns.Add(new DataColumn("StaffName", typeof(string))); 
       staffdt.Columns.Add(new DataColumn("RadioButtonList", typeof(ArrayList))); 
       staffdt.Columns.Add(new DataColumn("RemarkTbx", typeof(string))); 
       ArrayList listofradio = new ArrayList(); 
       listofradio.Add("1"); 
       listofradio.Add("2"); 
       listofradio.Add("3"); 
       listofradio.Add("4"); 
       listofradio.Add("5"); 
       listofradio.Add("6"); 
       listofradio.Add("7"); 
       listofradio.Add("N/A"); 

       foreach (string staffname in listofstaff) 
       { 
        staffdr = staffdt.NewRow(); 
        staffdr["StaffName"] = staffname; 
        staffdr["RadioButtonList"] = listofradio; 
        staffdr["RemarkTbx"] = string.Empty; 
        staffdt.Rows.Add(staffdr); 
       } 
       GridView staffGrid = (GridView)SubmitAppraisalGrid.FindControl("StaffAppraisalGrid"); 
       ViewState["QuestionTable"] = staffdt; 
       staffGrid.DataSource = staffdt; 
       staffGrid.DataBind(); 
       index++; 
      } 
      //before bind 
      SubmitAppraisalGrid.DataSource = dt; 
      SubmitAppraisalGrid.DataBind(); 

答えて

0

子GridViewのは、親のGridViewの一つのセルの下にあるので、これを試してみてください。あなたがアクセスしたときにそう、それがあるべき... ParentGridView.Row [rowIdx] .FindControl

//行インデックス

GridView staffGrid = (GridView)SubmitAppraisalGrid.Row[0].FindControl("StaffAppraisalGrid"); 
+0

ermmいや、それはいけない仕事。 ArgumentOutOfRangeエラーが出ます。 –

+0

Emm ..ルーピングして子グリッドビューを見つけるあなたのコードをproivdeできますか? –

0

このコードを試してみてください

protected void GVmaster_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 


if (e.Row.RowType == DataControlRowType.DataRow) 
{ 
    GridView gvc = (GridView)e.Row.FindControl("gvChild"); 
} 

} 
関連する問題