我有一个带有文本框和按钮的asp.net表单。每次单击按钮时,我都需要将文本框中的文本添加为表格中的新行,然后将其显示在网格视图中。
我已经设法将文本框中的文本添加为新行,但每次单击按钮时,表格似乎都没有保存(意思是 - 我最终只有一行)。
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();
}
}
我猜这与回发有关...
答案 0 :(得分:3)
这里的问题在于无国籍状态"的asp.net。简而言之,每次往返页面(首次访问,回发后)都会创建buildTable
的新实例,从而重新实例化dt
变量并将其设置为网格的数据源。 / p>
考虑将用户输入发送到某种持久层,使您能够按每个用户保存数据并在每个帖子中重新绑定所述数据。可以在这里使用的策略实际上取决于应用程序的大小和上下文。
请参阅:
答案 1 :(得分:1)
您需要将ID和表添加到Viewstate以便保留State,因为这里我们不会将数据保存在数据库中。因此,每次页面加载时,数据都是空的,除非我们将它保存在视图状态中。
检查以下代码: - 它将完美运行: -
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();
}
答案 2 :(得分:0)
此代码与我一起正常运行, 在按钮单击事件中添加它们 :
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();