2017-02-20 6 views
0

Я разрабатываю веб-приложение для управления студенческими экзаменационными записями, но я сталкиваюсь с проблемой с моим gridview.Gridview контроллеры null после вставки столбца

Основная идея состоит в том, что пользователь может продолжать и вводить и обновлять информацию об экзамене студентов. Осложнения возникают, когда некоторые субъекты требуют заполнения разных полей, и это то, где моя проблема.

Исключение вызывается при запуске метода Save Button. Я получаю ссылку на Null Object, которая запускается при использовании методов AddAudit и UpdateRecord. После некоторой отладки от внешнего вида проблема заключается в том, что элементы управления (ddlDate, txtAssesmentLevel и т. Д.) Не объявляются из метода FindCotrol gridview, то есть при вызове методов 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; 
       } 
      } 
} 


} 

Сохранить метод (Exception Метательное)

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"); 


    }  

по строке данных Bound

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> 

P.S. Это мой первый вопрос, который, надеюсь, имеет смысл, и я открыт для указателей :)

Редактировать: метод загрузки страницы включает код для заполнения dgvBefore, а также несколько объектов аутентификации, которые я просто забыл включить в него.

+1

Джеймс, вопрос не ясен, хотя вы вставили много кода. Не могли бы вы обновить его с помощью точной постановки задачи? – A3006

+0

@ A3006 Проблема заключается в том, что когда я нажимаю кнопку сохранения, появляется исключение с ссылкой на нулевой объект. Элементы управления из gridview не назначаются, когда я использую метод поиска в начале метода сохранения. Ошибка возникает только при добавлении нового столбца «ddlSpeakingListening». –

ответ