如何在asp.net表中动态添加行?

时间:2010-06-09 07:45:13

标签: c# asp.net

如何从服务器端添加表中的行?

  if (!Page.IsPostBack)
  {
      Session["table"] = TableId;
  }
  else
  {
      TableId = (Table)Session["table"];
  }

protected void btnAddinRow_Click(object sender, EventArgs e)
{
      num_row = (TableId.Rows).Count;

      TableRow r = new TableRow();
      TableCell c1 = new TableCell();
      TableCell c2 = new TableCell();
      TextBox t = new TextBox();

      t.ID = "textID" + num_row;
      t.EnableViewState = true;

      r.ID = "newRow" + num_row;
      c1.ID = "newC1" + num_row;
      c2.ID = "newC2" + num_row;

      c1.Text = "New Cell - " + num_row;
      c2.Controls.Add(t);

      r.Cells.Add(c1);
      r.Cells.Add(c2);

      TableId.Rows.Add(r);
      Session["table"] = TableId;
}

在调试中我发现了“TableID”中的数字,但没有绘制行。

你对这个问题有所了解吗? 感谢

3 个答案:

答案 0 :(得分:3)

我认为你对动态控件感到困惑...如果你正在动态地创建表中的每一行...你需要在每个页面循环中创建它(具有相同的名称)..是否是回发或不......

简单来说,如果你创建的东西不在.aspx(标签)页面中,那么在你的代码中......在每次回发中都这样做......

在您的代码中,您正在从会话中检索表,但您没有将其再次添加到表单中......以下行就是这样做的。

            this.form1.Controls.Add(TableId);

这是一个工作代码,针对您的问题...希望这会有所帮助。请告诉我,如果您有任何疑问......此外,您可以尝试使用对象Datasource的DataGrid ...这将帮助您在回发时保留数据,而无需将其写入数据库。

    Table TableId = new Table();

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
        {
            TableId.ID = "MyTable";
        }
        else
        {
            TableId = (Table)Session["table"];
            this.form1.Controls.Add(TableId);
        }
    }

    protected void Page_PreRender(object sender, EventArgs e)
    {
        Session["table"] = TableId; 
    }


    protected void btnAddinRow_Click(object sender, EventArgs e)
    {
        int num_row = (TableId.Rows).Count;

        TableRow r = new TableRow();
        TableCell c1 = new TableCell();
        TableCell c2 = new TableCell();
        TextBox t = new TextBox();

        t.ID = "textID" + num_row;
        t.EnableViewState = true;

        r.ID = "newRow" + num_row;
        c1.ID = "newC1" + num_row;
        c2.ID = "newC2" + num_row;

        c1.Text = "New Cell - " + num_row;
        c2.Controls.Add(t);

        r.Cells.Add(c1);
        r.Cells.Add(c2);

        TableId.Rows.Add(r);
        Session["table"] = TableId;
    }

答案 1 :(得分:2)

我想知道为什么你会使用一个表而不是那个功能强大的GridView控件,你可以轻松完成这个?

GridView可以与DataTable连接,因为它本身就是DataSource,因此,如果您需要创建新行,您只需要创建一个新的DataRow进入DataTable并再次绑定它。

您可以使用javascript(Ajax调用)或代码隐藏来使用它。

DataTable dt = (DataTable)Session["myData"];
DataRow dr = dt.NewRow();
dt.Rows.Add(dt);

myGridView.DataSource = dt;
myGridView.DataBind();

您不需要担心ID,因为它们将是独一无二的,例如,在保存时,您可以轻松遍历所有行并执行每行所需的操作,例如

public void SaveData()
{
    myBusinessObjectCollection = new myBusinessObjectCollection();

    foreach (GridViewRow row in myGridView.Rows)
    {
        myBusinessObjectCollection.Add(
            new myBusinessObject
            {
                C1 = ((TextBox)row.FindControl("txtNewC1")).Text,
                C2 = ((TextBox)row.FindControl("txtNewC2")).Text
            });
    }

    myBusinessObjectCollection.Save();
}

答案 2 :(得分:0)

在ASP.NET控件中重新创建每个回发,因此在会话中保存表上的链接没有意义。

在会话(或视图状态)中存储描述您的表(DataTable或强类型对象的集合)的一些结构,在单击按钮事件上添加此结构中的行,并使用OnPreRender上的此结构重新绑定表事件