向ASP.NET表中添加行会覆盖以前的行

时间:2013-12-18 19:19:44

标签: c# asp.net

我有一个数据输入表,每行有一个AJAX ComboBox和一个HTML文本输入。我无法通过Javascript动态添加ComboBoxes行,所以我创建了一个“添加行”按钮。在最初添加行以填充数据时,按钮触发事件会删除这些行,因此表只有新行。这两种方法都使用Table.Rows.Add(row),并且通过相同的方法为初始和按钮触发的行添加生成行。

这是我生成行的代码:

protected System.Web.UI.HtmlControls.HtmlTableRow getEmptyRow(int rowNum, bool script)
{
    HtmlTableRow row = new HtmlTableRow();
    HtmlTableCell a = new HtmlTableCell();
    a.Style.Add("width", "75%");
    var chgsarray = d.WaterRates.Select(q => q.Name)
        .Where(q => !q.Contains("test"))
        .OrderBy(q => q); 

    AjaxControlToolkit.ComboBox t = new AjaxControlToolkit.ComboBox() { ID = "chrgName" + rowNum, AutoPostBack = false, DataSource = chgsarray, AutoCompleteMode = AjaxControlToolkit.ComboBoxAutoCompleteMode.SuggestAppend, ItemInsertLocation = AjaxControlToolkit.ComboBoxItemInsertLocation.Append, DropDownStyle = AjaxControlToolkit.ComboBoxStyle.DropDown };
    t.DataBind();
    t.Text = "";

    a.Controls.Add(t);
    row.Cells.Add(a);
    a = new HtmlTableCell();
    a.Style.Add("width", "25%");
    a.InnerText = "$";
    HtmlInputText tc = new HtmlInputText() { ID = "chrgChrg" + rowNum, Name = "chrgChrg" + rowNum, ViewStateMode = ViewStateMode.Disabled, ClientIDMode = ClientIDMode.Static };
    tc.Style.Add("width", "182px");

    a.Controls.Add(tc);
    row.Cells.Add(a);
    return row;
}

按下按钮时添加行的代码非常简单:

protected void Add_Row(Object sender, EventArgs e)
{
    int k = -1;
    for (int i = 0; Request.Form.AllKeys.Contains("ctl00$MainContent$chrgChrg" + i); i++)
        k++;
        ChargesTable.Rows.Add(getEmptyRow(k+1, true));
}

那么在添加新行时如何保留现有行呢?

1 个答案:

答案 0 :(得分:3)

请记住,网络是无国籍的。

除非另有说明。

您无法在回发中保留表行。原始<asp:Table>将在每次回发时恢复。

您必须在会话状态中保留行的数据列表,然后在每个回发上重新创建所有行,然后在按钮单击上添加行。

更好的是,使用GridView并将其绑定到会话状态中的数据。