动态地向DataTable添加行

时间:2015-01-02 14:45:59

标签: c# asp.net dynamic datatable postback

我有一个带有文本框和按钮的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();
}

}

我猜这与回发有关...

3 个答案:

答案 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();