2017-02-20 62 views
0

我正在開發一個Web應用程序來管理學生考試條目,但我遇到了一個問題,我的gridview。插入列後Gridview控制器爲空

的基本思路是,用戶可以去和一個學生考試輸入和更新的詳細信息。當某些主題需要填充不同的字段時會出現併發症,這就是我的問題所在。運行保存按鈕方法時

拋出異常。運行AddAudit和UpdateRecord方法時,會得到一個Null Object引用。在從外觀上進行一些調試後,問題是控件(ddlDate,txtAssesmentLevel等)沒有從GridView的FindCotrol方法中聲明,這意味着當調用AddAudit和UpdateRecord方法時,它們指向一個空控制器。

要知道,當代碼不是「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 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"); 


    }  

在行數據綁定

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。 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> 

附:這是我的第一個問題,希望它是有道理的,我很樂意指點:)

編輯:頁面加載方法確實包含代碼來填充dgvBefore以及一些認證的東西,我只是忘了包含它。

+1

詹姆斯,雖然你已經粘貼了大量的代碼的問題不明確。你能否用確切的問題陳述來更新它? – A3006

+0

@ A3006問題是,當我按下保存按鈕時,拋出了一個空對象引用異常。在Save方法開始時,GridView中的控件沒有被分配到我使用查找控制方法的地方。僅當添加新的「ddlSpeakingListening」列時纔會出現該錯誤。 –

回答