插入列

时间:2017-02-20 14:01:36

标签: c# asp.net gridview

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

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

运行“保存按钮”方法时抛出异常。运行AddAudit和UpdateRecord方法时,我得到一个Null Object引用。从它的外观进行一些调试后,问题是没有从gridview的FindCotrol方法声明控件(ddlDate,txtAssesmentLevel等),这意味着当调用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> 

P.S。这是我的第一个问题,希望它有意义,我愿意接受指示:)

编辑:页面加载方法确实包含填充dgvBefore的代码以及一些我只是忘记包含它的身份验证。

1 个答案:

答案 0 :(得分:0)

我认为您需要在每次回发时添加下拉列表列。请参阅此链接:https://www.codeproject.com/Tips/682689/Add-populated-dropdownlist-to-GridView-dynamically