c# - 通过单击 asp.net 中的按钮在网格中添加多行
问题描述
我需要通过单击按钮在 Gridview 中动态添加 'n' 行和 'm' 列数(行包含 m 个文本框)。当用户点击按钮时,一个特定的整数值被初始化为一个变量,该变量是所需的行数。假设它的值为 8,因此动态创建了包含 m 个文本框的 8 行。
目前我浏览了这个文档并实现了相同的: link
对于多行的功能,我只是添加了一些约束并注释了一些不需要的代码,如下代码:
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();
}
调试后出现错误:索引超出范围。必须是非负数且小于集合的大小。
解决方案
希望这能解决你的问题
页面加载
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
load();
}
}
加载()
protected void load()
{
if (ViewState["CurrentData"] == null)
{
DataTable dt = (DataTable)ViewState["CurrentData"];
BindGrid(1);
}
}
绑定网格()
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;
}
按钮点击事件
protected void ButtonAdd_Click(object sender, EventArgs e)
{
DataTable dt = (DataTable)ViewState["CurrentData"];
int count = dt.Rows.Count;
BindGrid(count);
}
推荐阅读
- javascript - 元素隐式具有“任何”类型,因为“字符串”类型的表达式不能用于索引类型“BGColors”
- github-actions - 在 GitHub Actions 中捕获标准错误
- python - PySpark:管道失败,出现“java.util.NoSuchElementException:Param generateMissingLabels 不存在”。
- laravel - 类 Illuminate\Support\Collection 的对象无法在 Laravel 8 中转换为 int
- javascript - 在for循环中使用innerText,这在javascript中不起作用
- reactjs - 图表中的小数到 toFixed()
- matlab - 为什么这个程序(对于两个矩阵的乘积)不起作用?
- visual-studio - 出现错误时如何取消锁定 Visual Studio 中的成员
- jquery - 连接表为空时超时错误sql
- python - 在日期时间中按日期过滤数据框