动态添加行到DataTable
Dynamically add rows to DataTable
我有一个带有文本框和按钮的 asp.net 表单。每次单击按钮时,我都需要将文本框中的文本添加为 table 中的新行,然后将其显示在 gridview 上。
我已经设法将文本框中的文本添加为新行,但每次单击按钮时,似乎 table 都没有保存(意思是 - 我最终只有一行)。
public partial class buildTable : System.Web.UI.Page
{
DataTable dt = new DataTable();
public int namesCounter;
protected void Page_Load(object sender, EventArgs e)
{
dt.Columns.Add("ID", typeof(Int16));
dt.Columns.Add("name", typeof(string));
namesCounter = 0;
names_GV.DataSource = dt;
}
protected void addName_Click(object sender, EventArgs e)
{
namesCounter += 1;
DataRow dtrow = dt.NewRow();
dtrow["ID"] = namesCounter;
dtrow["name"] = newName_TXT.Text;
dt.Rows.Add(dtrow);
names_GV.DataBind();
}
}
我猜这与回发有关...
这里的问题在于asp.net的"statelessness"。简而言之,页面的每次往返(第一次访问,post-返回)都会创建一个新的 buildTable
实例,从而重新实例化您的 dt
变量并将其设置为数据源你的网格。
考虑将用户输入发送到某种持久层,使您能够保存每个用户的数据并重新绑定每个 post 返回的数据。可以在此处使用的策略实际上取决于应用程序的大小和上下文。
请参考:
- Microsoft 针对状态管理策略的 ASP.NET 状态管理概述 (http://msdn.microsoft.com/en-us/library/75x4ha6s(v=vs.100).aspx)
- Microsoft 的状态管理建议 (http://msdn.microsoft.com/en-us/library/z1hkazw7(v=vs.100).aspx) 用于状态管理建议
- ASP.NET 网页简介 (http://msdn.microsoft.com/en-us/library/ms178125(v=vs.100).aspx),了解有关页面生命周期的更多详细信息
您需要将 ID 和 Table 添加到 Viewstate 以便保留状态,因为这里我们没有将数据保存在数据库中。所以每次页面加载时,数据都是空的,除非我们将它保存在视图状态中。
检查下面的代码:-
它会 运行 完美 :-
DataTable dt = new DataTable();
public int namesCounter;
protected void Page_Load(object sender, EventArgs e)
{
dt.Columns.Add("ID", typeof(Int32));
dt.Columns.Add("name", typeof(string));
//namesCounter = 0;
if (!IsPostBack)
{
ViewState["Number"] = 0;
ViewState["table"] = dt;
}
names_GV.DataSource = dt;
names_GV.DataBind();
}
protected void addName_Click(object sender, EventArgs e)
{
dt = (DataTable)ViewState["table"];
namesCounter = Convert.ToInt32(ViewState["Number"]) + 1;
ViewState["Number"] = namesCounter;
DataRow dtrow = dt.NewRow();
dtrow[0] = namesCounter;
// dtrow["ID"] = namesCounter;
dtrow["name"] = newName_TXT.Text;
dt.Rows.Add(dtrow);
ViewState["table"] = dt;
names_GV.DataSource = dt;
names_GV.DataBind();
}
这段代码对我来说工作正常,
将它们添加到按钮单击事件中
:
DataTable dt_items = new DataTable();
dt_items.Columns.Add("Item");
dt_items.Columns.Add("Quantity");
if (grid_items.Rows.Count > 0)
{
foreach (GridViewRow row in grid_items.Rows)
{
dt_items.Rows.Add(row.Cells[0].Text,row.Cells[1].Text);
}
}
dt_items.Rows.Add(ddl_item.SelectedItem.Text, txt_itemAmount.Text);
grid_items.DataSource = dt_items;
grid_items.DataBind();
我有一个带有文本框和按钮的 asp.net 表单。每次单击按钮时,我都需要将文本框中的文本添加为 table 中的新行,然后将其显示在 gridview 上。
我已经设法将文本框中的文本添加为新行,但每次单击按钮时,似乎 table 都没有保存(意思是 - 我最终只有一行)。
public partial class buildTable : System.Web.UI.Page
{
DataTable dt = new DataTable();
public int namesCounter;
protected void Page_Load(object sender, EventArgs e)
{
dt.Columns.Add("ID", typeof(Int16));
dt.Columns.Add("name", typeof(string));
namesCounter = 0;
names_GV.DataSource = dt;
}
protected void addName_Click(object sender, EventArgs e)
{
namesCounter += 1;
DataRow dtrow = dt.NewRow();
dtrow["ID"] = namesCounter;
dtrow["name"] = newName_TXT.Text;
dt.Rows.Add(dtrow);
names_GV.DataBind();
}
}
我猜这与回发有关...
这里的问题在于asp.net的"statelessness"。简而言之,页面的每次往返(第一次访问,post-返回)都会创建一个新的 buildTable
实例,从而重新实例化您的 dt
变量并将其设置为数据源你的网格。
考虑将用户输入发送到某种持久层,使您能够保存每个用户的数据并重新绑定每个 post 返回的数据。可以在此处使用的策略实际上取决于应用程序的大小和上下文。
请参考:
- Microsoft 针对状态管理策略的 ASP.NET 状态管理概述 (http://msdn.microsoft.com/en-us/library/75x4ha6s(v=vs.100).aspx)
- Microsoft 的状态管理建议 (http://msdn.microsoft.com/en-us/library/z1hkazw7(v=vs.100).aspx) 用于状态管理建议
- ASP.NET 网页简介 (http://msdn.microsoft.com/en-us/library/ms178125(v=vs.100).aspx),了解有关页面生命周期的更多详细信息
您需要将 ID 和 Table 添加到 Viewstate 以便保留状态,因为这里我们没有将数据保存在数据库中。所以每次页面加载时,数据都是空的,除非我们将它保存在视图状态中。
检查下面的代码:- 它会 运行 完美 :-
DataTable dt = new DataTable();
public int namesCounter;
protected void Page_Load(object sender, EventArgs e)
{
dt.Columns.Add("ID", typeof(Int32));
dt.Columns.Add("name", typeof(string));
//namesCounter = 0;
if (!IsPostBack)
{
ViewState["Number"] = 0;
ViewState["table"] = dt;
}
names_GV.DataSource = dt;
names_GV.DataBind();
}
protected void addName_Click(object sender, EventArgs e)
{
dt = (DataTable)ViewState["table"];
namesCounter = Convert.ToInt32(ViewState["Number"]) + 1;
ViewState["Number"] = namesCounter;
DataRow dtrow = dt.NewRow();
dtrow[0] = namesCounter;
// dtrow["ID"] = namesCounter;
dtrow["name"] = newName_TXT.Text;
dt.Rows.Add(dtrow);
ViewState["table"] = dt;
names_GV.DataSource = dt;
names_GV.DataBind();
}
这段代码对我来说工作正常, 将它们添加到按钮单击事件中 :
DataTable dt_items = new DataTable();
dt_items.Columns.Add("Item");
dt_items.Columns.Add("Quantity");
if (grid_items.Rows.Count > 0)
{
foreach (GridViewRow row in grid_items.Rows)
{
dt_items.Rows.Add(row.Cells[0].Text,row.Cells[1].Text);
}
}
dt_items.Rows.Add(ddl_item.SelectedItem.Text, txt_itemAmount.Text);
grid_items.DataSource = dt_items;
grid_items.DataBind();