2017-02-20 1 views
0

학생 시험 항목을 관리하기 위해 웹 응용 프로그램을 개발하고 있지만 gridview에 문제가 있습니다.열을 삽입 한 후 Gridview 컨트롤러가 null입니다.

기본 아이디어는 사용자가 계속해서 학생 시험의 세부 정보를 입력하고 업데이트 할 수 있다는 것입니다. 특정 피사체가 다른 필드가 채워지도록 요구할 때 문제가 발생하며 이것이 내 문제입니다.

저장 단추 메서드를 실행하면 예외가 throw됩니다. AddAudit 및 UpdateRecord 메서드를 실행할 때 Null 개체 참조가 throw됩니다. 보이는 것에서 일부 디버깅 후 문제는 컨트롤 (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. 이것은 내 첫 번째 질문은 잘하면 그것이 의미가 있고, 포인터에 열려 있습니다 :)

편집 : 페이지로드 메서드는 dgvBefore뿐만 아니라 그것을 포함하는 것을 잊어 버린 몇 가지 인증 것들을 채우는 코드를 포함하고 있습니다.

+1

제임스, 많은 코드를 붙여도 질문이 명확하지 않습니다. 정확한 문제 진술로 업데이트 해 주시겠습니까? – A3006

+0

@ A3006 문제는 저장 단추를 누르면 null 개체 참조 예외가 throw됩니다. Save 메서드의 시작 부분에서 Find Control Method를 사용하는 곳에 gridview의 컨트롤이 할당되지 않습니다. 새 "ddlSpeakingListening"열을 추가 할 때 오류가 발생합니다. –

답변

관련 문제