2

I need to add 'n' number of rows with 'm' number of column in the Gridview dynamically(rows contains m number of textbox) through on click of button for ex. when a user click on button, A particular integer value is initialize to a variable, and the variable is the number of rows required. Let say it's value is 8, so 8 rows containing m number of textbox has been created dynamically.`

Currently I go through this doc and implemented the same: link

for functionality of multiple rows i just added some constraint and comment some code which is not required as code below:

 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)));
        dr = dt.NewRow();
        dr["RowNumber"] = 1;
        dr["Column1"] = string.Empty;
        dr["Column2"] = string.Empty;
        dr["Column3"] = string.Empty;
        dt.Rows.Add(dr);

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

        Gridview1.DataSource = dt;
        Gridview1.DataBind();
    }
    private void AddNewRowToGrid()
    {
        try
        {
            int j = 8, rowIndex = 0;

            //if (ViewState["CurrentTable"] != null)
            //{
            DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
            DataRow drCurrentRow = null;
            if (dtCurrentTable.Rows.Count > 0)
            {
                for (int i = 1; i <= j; 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");

                    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;

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

                Gridview1.DataSource = dtCurrentTable;
                Gridview1.DataBind();
            }
        }
        catch (Exception ex)
        {

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

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

    //                rowIndex++;
    //            }
    //        }
    //    }
    //}
    protected void Page_Load(object sender, EventArgs e)
    {

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

after debug I got an error: Index was out of range. Must be non-negative and less than the size of the collection.

2
  • I dont think you can do that in gridview. As I know, we can only create dummy column for result. #CMIIW Commented Jul 22, 2019 at 10:07
  • Is there any other solution to implement this? Commented Jul 22, 2019 at 10:47

2 Answers 2

1

try This

 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)));
           dr = dt.NewRow();
           dr["RowNumber"] = 1;
           dr["Column1"] = string.Empty;
           dr["Column2"] = string.Empty;
           dr["Column3"] = string.Empty;
           dt.Rows.Add(dr);
           ViewState["CurrentTable"] = dt;

           Gridview1.DataSource = dt;
           Gridview1.DataBind();
       }
       private void AddNewRowToGrid()
       {
           try
           {
               int j = 8, rowIndex = 0;

               DataTable dtCurrentTable = (DataTable)ViewState["CurrentTable"];
               DataRow drCurrentRow = null;

               if (dtCurrentTable.Rows.Count > 0)
               {
                   for (int i = 1; i <= j; 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");

                       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.Add(drCurrentRow);
                   }
                  // dtCurrentTable.Rows.Add(drCurrentRow);
                   ViewState["CurrentTable"] = dtCurrentTable;

                   Gridview1.DataSource = dtCurrentTable;
                   Gridview1.DataBind();
               }
           }
           catch (Exception ex)
          {

           }

       protected void Page_Load(object sender, EventArgs e)
       {

           if (!Page.IsPostBack)
           {
               SetInitialRow();
           }
       }
       protected void ButtonAdd_Click(object sender, EventArgs e)
       {
           AddNewRowToGrid();
       }
Sign up to request clarification or add additional context in comments.

Comments

1

Hope this will solve your problem

Page Load

  protected void Page_Load(object sender, EventArgs e)
    {

        if (!Page.IsPostBack)
        {
            load();
        }
    }

load()

protected void load()
    {
     if (ViewState["CurrentData"] == null)
      {
       DataTable dt = (DataTable)ViewState["CurrentData"];
       BindGrid(1);
      }
    }

BindGrid()

 private void BindGrid(int rowcount)
    {
            DataTable dt = new DataTable();
            DataRow dr;
            DataColumn RcAccCode, RcAccAccount, RcAmount, RcAccId;
            int temp = 0;
            int a = 0;
            RcAccCode = new DataColumn("RcAccCode", Type.GetType("System.String"));
            RcAccAccount = new DataColumn("RcAccAccount", Type.GetType("System.String"));
            RcAmount = new DataColumn("RcAmount", Type.GetType("System.String"));
            RcAccId = new DataColumn("RcAccId", Type.GetType("System.String"));
            dt.Columns.Add(RcAccCode);
            dt.Columns.Add(RcAccAccount);
            dt.Columns.Add(RcAmount);
            dt.Columns.Add(RcAccId);
            TextBox TextBox1 = new TextBox();
            TextBox TextBox2 = new TextBox();
            TextBox TextBox3 = new TextBox();
                if (ViewState["CurrentData"] != null)
                {
                    dt = (DataTable)ViewState["CurrentData"];
                    if (dt.Rows.Count > 0)
                    {
                        dr = dt.NewRow();
                        dr[0] = dt.Rows[0][0].ToString();
                    }

                    for (int i = dt.Rows.Count - 1; i >= 0; i--)
                    {
                        DataRow dr1 = dt.Rows[i];
                        a = Convert.ToInt32(dr1["RcAccCode"].ToString());
                        break;
                    }
                    if (temp == 0)
                    {
                        dr = dt.NewRow();
                        dr[0] = a + 1;
                        dr[1] = TextBox1.Text;
                        dr[2] = TextBox2.Text;
                        dr[3] = TextBox3.Text;
                        dt.Rows.Add(dr);   
                    }
                }
                else
                {
                    dr = dt.NewRow();
                    dr[0] =1;
                    dr[1] = TextBox1.Text;
                    dr[2] = TextBox2.Text;
                    dr[3] = TextBox3.Text;
                    dt.Rows.Add(dr);
                }
            // If ViewState has a data then use the value as the DataSource
            if (ViewState["CurrentData"] != null)
            {
                Gridview1.DataSource = (DataTable)ViewState["CurrentData"];
                Gridview1.DataBind();     
            }
            else
            {
                // Bind GridView with the initial data assocaited in the DataTable
                Gridview1.DataSource = dt;
                Gridview1.DataBind();
            }
            // Store the DataTable in ViewState to retain the values
            ViewState["CurrentData"] = dt;
    }

Button Click Event

    protected void ButtonAdd_Click(object sender, EventArgs e)
    {
        DataTable dt = (DataTable)ViewState["CurrentData"];
        int count = dt.Rows.Count;
        BindGrid(count);
    }

2 Comments

what is the purpose of taking row count parameter in BindGrid method, You are not using this at all.
@KAbhishek I just give you a demo code. And you should customized this code on your own way If it help you.There are several thing that don't needed Or repeated. You can remove that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.