2017-02-20 8 views
0

私は学生試験のエントリを管理するWebアプリケーションを開発していますが、私はgridviewに問題を抱えています。列を挿入した後にGridviewコントローラがnullになる

基本的な考え方は、ユーザーが引き続き学生試験の詳細を入力して更新できることです。特定の被験者が異なる分野に人口が必要であることが合理化され、これが私の問題点です。

[保存ボタン]メソッドを実行すると、例外がスローされます。 AddAuditメソッドとUpdateRecordメソッドを実行するときにNullオブジェクト参照がスローされます。見た目からデバッグした後、問題はコントロール(ddlDate、txtAssesmentLevelなど)は、AddAuditメソッドとUpdateRecordメソッドが呼び出されたときにnullコントローラを指しているときに、GridViewのFindCotrolメソッドから宣言されていません。

コードが "C2555"でなくても、列とコントロールを動的に追加することで問題が疑われる場合は、この問題は発生しません。

詳細はお気軽にお問い合わせください。

ページの読み込み方法

protected void Page_Load(object sender, EventArgs e){ 

if(!IsPostBack){ 
//Selected class passed through 
    selectedClass sc = (selectedClass)Session["selectedClass"] as selectedClass; 

//Get Class Code 
    lblAosCode.Text = sc.getAOSCode(); 

//If class is English 
    if(lblAosCode.Text == "C2555"){ 
    TemplateField speakingListening = new TemplateField(); 
    speakingListening.HeaderText = "Speaking and Listening"; 
    dgvSelectedClasses.Columns.Insert(7, speakingListening); 
    } 


//Populate Gridview 
DataTable dsSelectedClasses = AccessData.getSelectedClasses(sc.getAOSCode(), sc.getAOSPeriod(), sc.getDescription());  
dgvSelectedClasses.DataSource = dsSelectedClasses; 
dgvSelectedClasses.DataBind(); 



//Check if txtAssesmentLevel is populated 
for (int index = 0; index < dgvSelectedClasses.Rows.Count; index++) 
      { 
      TextBox txtAssessmentLevel = (TextBox)dgvSelectedClasses.Rows[index].FindControl("txtAssessmentLevel"); 
       if (dgvBefore.Rows[index].Cells[4].Text != " ") 
       { 
        txtAssessmentLevel.ReadOnly = true; 
       } 
      } 
} 


} 

保存方法

protected void OnRowDataBound(object sender, GridViewRowEventArgs e) 
    { 

     if (e.Row.RowType == DataControlRowType.DataRow) 
     { 

      if (lblAosCode.Text.Contains("C2555")) 
      { 
       DropDownList ddlSpeakingListening = new DropDownList(); 
       ddlSpeakingListening.ID = "ddlSpeakingListening"; 
       ddlSpeakingListening.Items.Add("L1"); 
       ddlSpeakingListening.Items.Add("L2"); 
       ddlSpeakingListening.Items.Add("Entry"); 
       ddlSpeakingListening.Items.Add("NS"); 
       e.Row.Cells[7].Controls.Add(ddlSpeakingListening); 




      } 

     } 
    }  

ASPバウンド行のデータに(スローされた例外)

protected void btnSave_Click(object sender, EventArgs e) 
    { 



     for (int i = 0; i < dgvSelectedClasses.Rows.Count; i++) 
     { 
      DropDownList ddlL1L2 = (DropDownList)dgvSelectedClasses.Rows[i].FindControl("ddlL1L2"); 
      DropDownList ddlExamDate = (DropDownList)dgvSelectedClasses.Rows[i].FindControl("ddlExamDate"); 
      TextBox txtAssessmentLevel = (TextBox)dgvSelectedClasses.Rows[i].FindControl("txtAssessmentLevel"); 
      DropDownList ddlSpeakingListening = null; 
      if (lblAosCode.Text.Contains("C2555")) 
      { 
       ddlSpeakingListening = (DropDownList)dgvSelectedClasses.Rows[i].FindControl("ddlSpeakingListening"); 
      } 




      if (IsPostBack) 
      { 
       if (lblAosCode.Text.Contains("C2555")) 
       { 
        AccessData.addAudit(dgvSelectedClasses.Rows[i].Cells[0].Text, Context.User.Identity.Name, "Assessment Level", txtAssessmentLevel.Text, dgvBefore.Rows[i].Cells[4].Text); 
        AccessData.addAudit(dgvSelectedClasses.Rows[i].Cells[0].Text, Context.User.Identity.Name, "Exam request L1 or L2", ddlL1L2.SelectedValue, dgvBefore.Rows[i].Cells[14].Text); 
        AccessData.addAudit(dgvSelectedClasses.Rows[i].Cells[0].Text, Context.User.Identity.Name, "Exam Date", ddlExamDate.SelectedValue, dgvBefore.Rows[i].Cells[15].Text); 
        AccessData.addAudit(dgvSelectedClasses.Rows[i].Cells[0].Text, Context.User.Identity.Name, "Speaking and Listening", ddlSpeakingListening.SelectedValue, dgvBefore.Rows[i].Cells[7].Text); 

        AccessData.updateRecord(txtAssessmentLevel.Text, ddlL1L2.SelectedValue, ddlExamDate.SelectedValue, lblAosCode.Text, lblAosPeriod.Text, dgvSelectedClasses.Rows[i].Cells[0].Text, ddlSpeakingListening.SelectedValue); 
       } 
       else 
       { 
        AccessData.addAudit(dgvSelectedClasses.Rows[i].Cells[0].Text, Context.User.Identity.Name, "Assessment Level", txtAssessmentLevel.Text, dgvBefore.Rows[i].Cells[4].Text); 
        AccessData.addAudit(dgvSelectedClasses.Rows[i].Cells[0].Text, Context.User.Identity.Name, "Exam request L1 or L2", ddlL1L2.SelectedValue, dgvBefore.Rows[i].Cells[13].Text); 
        AccessData.addAudit(dgvSelectedClasses.Rows[i].Cells[0].Text, Context.User.Identity.Name, "Exam Date", ddlExamDate.SelectedValue, dgvBefore.Rows[i].Cells[14].Text); 

        AccessData.updateRecord(txtAssessmentLevel.Text, ddlL1L2.SelectedValue, ddlExamDate.SelectedValue, lblAosCode.Text, lblAosPeriod.Text, dgvSelectedClasses.Rows[i].Cells[0].Text); 
       } 
      } 

     } 

     Response.Redirect("~/contact"); 


    }  

は、以下の私の基本的なコードです。 NET

<asp:GridView ID="dgvSelectedClasses" runat="server" AutoGenerateColumns="False" OnRowDataBound="OnRowDataBound"> 
      <Columns> 
       <asp:BoundField DataField="StudentID" HeaderText="Student ID" ReadOnly="True" /> 
       <asp:BoundField DataField="StageCode" HeaderText="Stage Code" ReadOnly="True" /> 
       <asp:BoundField DataField="Forename" HeaderText="Forename" ReadOnly="True" /> 
       <asp:BoundField HeaderText="Surname" DataField="Surname" /> 
       <asp:TemplateField HeaderText="Assessment Level"> 

        <ItemTemplate> 
         <asp:TextBox ID="txtAssessmentLevel" Text ='<%#Bind("AssessmetLevel") %>' runat="server" Width="50px"></asp:TextBox> 
        </ItemTemplate> 
       </asp:TemplateField> 
       <asp:BoundField DataField="TargetLevel" HeaderText="Target Level" /> 
       <asp:BoundField DataField="Achievelevel" HeaderText="Achieve Level" /> 
       <asp:BoundField DataField="FELSOutcome" HeaderText="FELS Outcome" /> 
       <asp:BoundField DataField="Registration" HeaderText="Registration" /> 
       <asp:BoundField DataField="DateSpreadsheetSent" HeaderText="Last Update" /> 
       <asp:BoundField DataField="Dayofclass" HeaderText="Day of class" /> 
       <asp:BoundField DataField="Timeofclass" HeaderText="Time of class" /> 
       <asp:BoundField DataField="Location" HeaderText="Location" /> 
       <asp:TemplateField HeaderText="Exam request L1 or L2" > 
        <ItemTemplate> 
         <asp:DropDownList ID="ddlL1L2" runat="server" > 
          <asp:ListItem>Not Set</asp:ListItem> 
          <asp:ListItem>L1</asp:ListItem> 
          <asp:ListItem>L2</asp:ListItem> 

         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 

       <asp:TemplateField HeaderText="Exam date"> 
        <ItemTemplate> 
         <asp:DropDownList ID="ddlExamDate" runat="server"> 

         </asp:DropDownList> 
        </ItemTemplate> 
       </asp:TemplateField> 

      </Columns> 
     </asp:GridView> 


<asp:GridView ID="dgvBefore" runat="server" AutoGenerateColumns="False"> 
     <Columns> 
      <asp:BoundField DataField="StudentID" HeaderText="Student ID" ReadOnly="True" /> 
      <asp:BoundField DataField="StageCode" HeaderText="Stage Code" ReadOnly="True" /> 
      <asp:BoundField DataField="Forename" HeaderText="Forename" ReadOnly="True" /> 
      <asp:BoundField HeaderText="Surname" DataField="Surname" /> 
      <asp:BoundField DataField="AssessmetLevel" HeaderText="Assessment Level" NullDisplayText=" "/> 
      <asp:BoundField DataField="TargetLevel" HeaderText="Target Level" /> 
      <asp:BoundField DataField="AchieveLevel" HeaderText="Achieve Level" /> 
      <asp:BoundField DataField="FELSOutcome" HeaderText="FELS Outcome" /> 
      <asp:BoundField DataField="Registration" HeaderText="Registration" /> 
      <asp:BoundField DataField="DateSpreadsheetSent" HeaderText="Date Spreadsheet Sent" /> 
      <asp:BoundField DataField="Dayofclass" HeaderText="Day of class" /> 
      <asp:BoundField DataField="Timeofclass" HeaderText="Time of class" /> 
      <asp:BoundField DataField="Location" HeaderText="Location" /> 
      <asp:BoundField DataField="ExamrequestL1orL2" HeaderText="Exam request L1 or L2" /> 
      <asp:BoundField DataField="Examdate" HeaderText="Exam date" /> 
      <asp:BoundField DataField="Reviewed" HeaderText="Reviewed" /> 
     </Columns> 
    </asp:GridView> 

P.S.これは私の最初の質問です。うまくいけばそれは意味があり、私は指針を公開しています:)

編集:ページ読み込みメソッドには、dgvBeforeを読み込むコードと、それを含むことを忘れた認証が含まれています。

+1

ジェームズ、あなたは多くのコードを貼り付けているが、質問は明確ではありません。正確な問題文でそれを更新してください。 – A3006

+0

@ A3006問題は、保存ボタンを押したときにnullオブジェクト参照例外がスローされることです。グリッドビューのコントロールは、保存メソッドの開始時に検索コントロールメソッドを使用する場所に割り当てられていません。このエラーは、新しい "ddlSpeakingListening"列が追加された場合にのみ発生します。 –

答えて

関連する問題