C# 插入列后Gridview控制器为空

C# 插入列后Gridview控制器为空,c#,asp.net,gridview,C#,Asp.net,Gridview,我正在开发一个用于管理学生考试条目的Web应用程序,但我在gridview中遇到了一个问题 其基本思想是,用户可以继续输入并更新学生考试的详细信息。当某些主题需要填充不同的字段时会出现复杂情况,这就是我的问题所在 运行Save按钮方法时引发异常。我在运行AddAudit和UpdateRecord方法时抛出了一个空对象引用。从外观上看,经过一些调试后,问题在于没有从gridview的FindControl方法声明控件(ddlDate、TXTASSEMETLEVEL等),这意味着调用AddAudit

我正在开发一个用于管理学生考试条目的Web应用程序,但我在gridview中遇到了一个问题

其基本思想是,用户可以继续输入并更新学生考试的详细信息。当某些主题需要填充不同的字段时会出现复杂情况,这就是我的问题所在

运行Save按钮方法时引发异常。我在运行AddAudit和UpdateRecord方法时抛出了一个空对象引用。从外观上看,经过一些调试后,问题在于没有从gridview的FindControl方法声明控件(ddlDate、TXTASSEMETLEVEL等),这意味着调用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;
                }
            }
 }


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

未设定
L1
L2
另外,这是我的第一个问题,希望它有意义,我愿意接受指点:)


编辑:页面加载方法确实包含用于在之前填充DGV的代码,以及一些我刚刚忘记包含的身份验证内容。

我认为您需要在每次回发时添加下拉列表列。请参阅此链接:

James,虽然您粘贴了很多代码,但问题还不清楚。你能用准确的问题陈述来更新它吗?@A3006问题是当我按下“保存”按钮时,抛出了一个空对象引用异常。当我在Save方法的开头使用Find Control方法时,没有指定gridview中的控件。该错误仅在添加新的“ddlSpeakingListening”列时发生。
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: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>