簡體   English   中英

動態將行添加到DataTable

[英]Dynamically add rows to DataTable

我有一個帶文本框和按鈕的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();
}

}

我猜想這與回發有關...

這里的問題在於asp.net的“無狀態”。 簡而言之,每次到頁面的往返(第一次訪問,回發)都會創建一個buildTable的新實例,從而重新實例化dt變量並將其設置為網格的數據源。

考慮將用戶輸入發送到某種持久層,該持久層使您可以按用戶保留數據,並在每次回發時重新綁定所述數據。 這里可以使用的策略實際上取決於應用程序的大小和上下文。

請參閱:

您需要將ID和表添加到Viewstate,以便保留State,因為這里我們沒有將數據保存在數據庫中。 因此,每次頁面加載時,除非我們將其保存在viewstate中,否則Data為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();
}

這段代碼與我一起正常工作,將它們添加到按鈕單擊事件中:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM