【问题标题】:Dynamically add rows to DataTable将行动态添加到 DataTable
【发布时间】:2015-02-28 21:21:01
【问题描述】:

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

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

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

}

我猜这与回发有关...

【问题讨论】:

    标签: c# asp.net dynamic datatable postback


    【解决方案1】:

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

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

    请参考:

    【讨论】:

      【解决方案2】:

      您需要将 ID 和表添加到 Viewstate 以便保留状态,因为这里我们没有将数据保存在数据库中。因此,每次页面加载时,除非我们将其保存在视图状态中,否则数据为 Null。

      检查以下代码:- 它将完美运行:-

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

      【讨论】:

        【解决方案3】:

        此代码与我正常工作, 将它们添加到按钮单击事件中 :

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-06-15
          • 1970-01-01
          • 1970-01-01
          • 2014-12-26
          • 2021-07-01
          • 1970-01-01
          • 2012-04-15
          相关资源
          最近更新 更多