2015-01-02 113 views
1

我有一个带有文本框和按钮的asp.net窗体。每次单击按钮时,我都需要将文本框中的文本添加为​​表格中的新行,然后将其显示在gridview上。动态添加行到DataTable

我已经成功地将文本框中的文本添加为​​一个新行,但每次单击按钮时,似乎都没有保存表(意思是 - 我最终只有一行)。

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(); 
} 

}

我猜这事做与回传...

回答

2

这里的问题在于asp.net的 “无政府状态”。简而言之,每次往返页面(第一次访问,回发)都会创建一个新的buildTable实例,从而重新实例化您的dt变量并将其设置为网格的数据源。

考虑将用户输入发送到某种持久层,使您能够保存每个用户的数据并在每个回发后重新绑定所述数据。这里可以使用的策略实际上取决于应用程序的大小和上下文。

请参考:

1

您需要将ID和表添加到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(); 
} 
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();