动态添加行到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 返回的数据。可以在此处使用的策略实际上取决于应用程序的大小和上下文。

请参考:

您需要将 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();