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.