简体   繁体   中英

Add a new row in GridView with CheckBoxList control and TextBox

I am taking a grid-view with two text-box control and one checkboxlist control. While I am adding a new row in grid-view dynamically, then the two text-box contain the value in the previous row but the items in checkboxlist control not displayed in previous row.I want to maintain the state of checkboxlist in the previous row. How to do this? Can anyone give any suggestion?

     private void FirstGridViewRow()
 {
     DataTable dt = new DataTable();
     DataRow dr = null;
     dt.Columns.Add(new DataColumn("RowNumber", typeof(string)));
     dt.Columns.Add(new DataColumn("Col1", typeof(string)));
     dt.Columns.Add(new DataColumn("Col2", typeof(string)));
     dt.Columns.Add(new DataColumn("Col3", typeof(string)));
     dt.Columns.Add(new DataColumn("Col4", typeof(string)));
     dt.Columns.Add(new DataColumn("Col5", typeof(string)));
     dr = dt.NewRow();
     dr["RowNumber"] = 1;
     dr["Col1"] = string.Empty;
     dr["Col2"] = string.Empty;
     dr["Col3"] = string.Empty;
     dr["Col4"] = string.Empty;
     dr["Col5"] = string.Empty;
     dt.Rows.Add(dr);

     ViewState["CurrentTable"] = dt;

     grvStudentDetails.DataSource = dt;
     grvStudentDetails.DataBind();
 }



 private void AddNewRowbutton_click()
 {
     int rowIndex = 0;

     if (ViewState["CurrentTable"] != null)
     {
         DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
         DataRow drCurrentRow = null;
         if (dtCurrentTable.Rows.Count > 0)
         {
             for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
             {
                 TextBox actionitemname =
                   (TextBox)grvStudentDetails.Rows[rowIndex].Cells[1].FindControl("txtName");
                 TextBox actionduedate =
                   (TextBox)grvStudentDetails.Rows[rowIndex].Cells[2].FindControl("txtAge");
                 CheckBoxList assignee = (CheckBoxList)grvStudentDetails.Rows[rowIndex].Cells[5].FindControl("chkAssignees");
                 drCurrentRow = dtCurrentTable.NewRow();
                 drCurrentRow["RowNumber"] = i + 1;

                 dtCurrentTable.Rows[i - 1]["Col1"] = actionitemname.Text;
                 dtCurrentTable.Rows[i - 1]["Col2"] = actionduedate.Text;
                 //dtCurrentTable.Rows[i - 1]["Col5"] = assignee.SelectedItem.Text;
                 rowIndex++;
             }
             dtCurrentTable.Rows.Add(drCurrentRow);
             ViewState["CurrentTable"] = dtCurrentTable;
             grvStudentDetails.DataSource = dtCurrentTable;
             grvStudentDetails.DataBind();
         }
     }
     else
     {
         Response.Write("ViewState is null");
     }
     SetPreviousData();
 }

     private void SetPreviousData()
 {
     int rowIndex = 0;
     if (ViewState["CurrentTable"] != null)
     {
         DataTable dt = (DataTable)ViewState["CurrentTable"];
         if (dt.Rows.Count > 0)
         {
             for (int i = 0; i < dt.Rows.Count; i++)
             {
                 TextBox TextBoxName = (TextBox)grvStudentDetails.Rows[rowIndex].Cells[1].FindControl("txtName");
                 TextBox TextBoxAge = (TextBox)grvStudentDetails.Rows[rowIndex].Cells[2].FindControl("txtAge");
                 TextBoxName.Text = dt.Rows[i]["Col1"].ToString();
                 TextBoxAge.Text = dt.Rows[i]["Col2"].ToString();
                 rowIndex++;
             }
         }
     }
 }

You can follow example shown here .

In aspx:

<div>
<asp:gridview ID="Gridview1" runat="server" ShowFooter="true" AutoGenerateColumns="false">
        <Columns>
        <asp:BoundField DataField="RowNumber" HeaderText="Row Number" />
        <asp:TemplateField HeaderText="Header 1">
            <ItemTemplate>
                <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Header 2">
            <ItemTemplate>
                <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Header 3">
            <ItemTemplate>
                 <asp:TextBox ID="TextBox3" runat="server"></asp:TextBox>
            </ItemTemplate>
         </asp:TemplateField>
             <asp:TemplateField HeaderText="Header 4">
            <ItemTemplate>
                 <asp:CheckBox ID="CheckBox1" runat="server"></asp:CheckBox>
            </ItemTemplate>
            <FooterStyle HorizontalAlign="Right" />
            <FooterTemplate>
             <asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" 
                    onclick="ButtonAdd_Click" />
            </FooterTemplate>
        </asp:TemplateField>
        </Columns>
    </asp:gridview>
</div>

in .cs file :

 private void SetInitialRow()
    {
        DataTable dt = new DataTable();
        DataRow dr = null;
        dt.Columns.Add(new DataColumn("RowNumber", typeof(string)));
        dt.Columns.Add(new DataColumn("Column1", typeof(string)));
        dt.Columns.Add(new DataColumn("Column2", typeof(string)));
        dt.Columns.Add(new DataColumn("Column3", typeof(string)));
        dt.Columns.Add(new DataColumn("Column4", typeof(string)));

        dr = dt.NewRow();
        dr["RowNumber"] = 1;
        dr["Column1"] = string.Empty;
        dr["Column2"] = string.Empty;
        dr["Column3"] = string.Empty;
        dr["Column4"] = string.Empty;
        dt.Rows.Add(dr);

        //Store the DataTable in ViewState
        ViewState["CurrentTable"] = dt;

        Gridview1.DataSource = dt;
        Gridview1.DataBind();
    }

    private void AddNewRowToGrid()
    {
        int rowIndex = 0;

        if (ViewState["CurrentTable"] != null)
        {
            DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
            DataRow drCurrentRow = null;
            if (dtCurrentTable.Rows.Count > 0)
            {
                for (int i = 1; i <= dtCurrentTable.Rows.Count; i++)
                {
                    //extract the TextBox values
                    TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
                    TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2");
                    TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3");
                    CheckBox chkBx = (CheckBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("CheckBox1");

                    drCurrentRow = dtCurrentTable.NewRow();
                    drCurrentRow["RowNumber"] = i + 1;

                    dtCurrentTable.Rows[i - 1]["Column1"] = box1.Text;
                    dtCurrentTable.Rows[i - 1]["Column2"] = box2.Text;
                    dtCurrentTable.Rows[i - 1]["Column3"] = box3.Text;
                    dtCurrentTable.Rows[i - 1]["Column4"] = chkBx.Checked.ToString();

                    rowIndex++;
                }

                dtCurrentTable.Rows.Add(drCurrentRow);
                ViewState["CurrentTable"] = dtCurrentTable;

                Gridview1.DataSource = dtCurrentTable;
                Gridview1.DataBind();
            }
        }
        else
        {
            Response.Write("ViewState is null");
        }

        //Set Previous Data on Postbacks
        SetPreviousData();
    }

    private void SetPreviousData()
    {
        int rowIndex = 0;
        if (ViewState["CurrentTable"] != null)
        {
            DataTable dt = (DataTable)ViewState["CurrentTable"];
            if (dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    TextBox box1 = (TextBox)Gridview1.Rows[rowIndex].Cells[1].FindControl("TextBox1");
                    TextBox box2 = (TextBox)Gridview1.Rows[rowIndex].Cells[2].FindControl("TextBox2");
                    TextBox box3 = (TextBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("TextBox3");
                    CheckBox chkBx = (CheckBox)Gridview1.Rows[rowIndex].Cells[3].FindControl("CheckBox1");

                    box1.Text = dt.Rows[i]["Column1"].ToString();
                    box2.Text = dt.Rows[i]["Column2"].ToString();
                    box3.Text = dt.Rows[i]["Column3"].ToString();


                    chkBx.Checked = dt.Rows[i]["Column4"].ToString().ToUpperInvariant()=="TRUE";

                    rowIndex++;
                }
            }
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            SetInitialRow();
        }
    }

    protected void ButtonAdd_Click(object sender, EventArgs e)
    {
        AddNewRowToGrid();
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM