我的问题是:
在一个WebForm中,点击页面上的添加按钮,在一个table中插入一行,并且在这一行中添加一个TextBox控件,再点击一下添加按钮,又会再table中插入一行,并添加一个TextBox,就是说点一下添加,就多生成一个控件,并且以前添加的TextBox中的信息不要丢失,急用呀,高手帮忙!

解决方案 »

  1.   

    private void Button1_Click(object sender, System.EventArgs e)
    {
    Table1.Rows.Add(new HtmlTableRow());
    for (int i=0;i<Table1.Rows[0].Cells.Count;i ++ )
    {
    TextBox textbox = new TextBox();
    textbox.ID = "txt1"+Convert.ToString((Table1.Rows.Count-1))+i.ToString();
    HtmlTableCell cell = new HtmlTableCell();
    if (i==0)
    {
    textbox.Width=Unit.Parse("20");
    }
    textbox.BorderStyle = BorderStyle.Groove;
    cell.Controls.Add(textbox);
    Table1.Rows[Table1.Rows.Count-1].Cells.Add(cell);
    }
    ViewState["Table1RowCount"] = Table1.Rows.Count;
    }
      

  2.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    // Put user code to initialize the page here
    if (ViewState["Table1RowCount"] != null)
    {
    for (int i = 1;i < (int)ViewState["Table1RowCount"];i ++)
    {
    Table1.Rows.Add(new HtmlTableRow());
    for (int j=0;j<Table1.Rows[0].Cells.Count;j ++ )
    {
    TextBox textbox = new TextBox();
    textbox.ID = "txt1"+i.ToString()+j.ToString();
    HtmlTableCell cell = new HtmlTableCell();
    textbox.BorderStyle = BorderStyle.Groove;
    if (j==0)
    {
    textbox.Width=Unit.Parse("20");
    }
    cell.Controls.Add(textbox);
    Table1.Rows[i].Cells.Add(cell);
    }
    }
    }
    }
      

  3.   

    多谢luaiping,那么能不能帮我实现一下删除功能呢,就是在每一个控件后面有一个删除按钮,点击它,删除该控件。问题解决,马上结账。分不够可以再加。
      

  4.   

    Table1.Rows[i].Cells.Controls.Clear();
    大概是这样写的.
      

  5.   

    p 是 PlaceHolder,c是你写好的包涵表格一航和Textbox的控件Click Event:if (Session["p"] != null)
      p = (PlaceHolder)Session["p"];
    p.Controls.Add(new c());
    Session["p"] = p;
      

  6.   

    c是你写好的包涵表格一航和Textbox,一个删除按钮的控件
    删除click事件这么写:
    PlaceHolder p = (PlaceHolder)this.parent;
    p.Controls.Remove(this);
      

  7.   

    1.动态添加表格行Function AddRow(ByVal i, ByVal tr1)        Dim td1 As New TableCell()
            Dim td2 As New TableCell()
            Table2.CellPadding = 0
            Table2.CellSpacing = 0        tr1.BackColor = Color.LightGray        td1.HorizontalAlign = HorizontalAlign.Center
            td2.HorizontalAlign = HorizontalAlign.Center
            td1.VerticalAlign = VerticalAlign.Middle
            td1.BorderColor = Color.Black
            td2.BorderColor = Color.Black        td1.BorderWidth = Unit.Pixel(1)
            td2.BorderWidth = Unit.Pixel(1)        Dim txtXx As New TextBox()
            txtXx.Width = Unit.Pixel(50)
            txtXx.ID = "xx" + i.ToString()
            td1.Text = "option" + i.ToString()
            td2.Controls.Add(txtXx)        tr1.Cells.Add(td1)
            tr1.Cells.Add(td2)        Table2.Rows.Add(tr1)    End Function
        Function addrow2(ByVal i)
            Dim txtXx As New TextBox()
            txtXx.Width = Unit.Pixel(10)
            txtXx.ID = "xx" + i.ToString()
            Page.Controls.Add(txtXx)
        End Function
        Function add3(ByVal tr As TableRow)
            Dim txtXx As New TextBox()
            txtXx.Width = Unit.Pixel(100)
            txtXx.ID = "xx" + i.ToString()
            txtXx.Text = "option" + i.ToString()        Dim td As New TableCell()
            td.Controls.Add(txtXx)
            tr.Cells.Add(td)
            Table2.Rows.Add(tr)
        End FunctionTable tb=new Table();
    try
    {
      tb.Attributes.Remove("style");
      tb.Atrributes.Add("style","border-style:None;width:940px;word-break:break-all; word-wrap: break-word;");
    }
    catch(Exception ex)
    {
      throw(ex); 
    }
      

  8.   

    忘了,最后还要Session["p"] = p;保存一下
      

  9.   

    我这里的c是一个用户控件,其中包括删除按钮,请问click事件是写在用户控件中,还是写在主页面中呢
      

  10.   

    在 Visual Basic .NET 和 Visual C# .NET 中创建控件数组Matthew A. Stoecker
    Visual Studio Team
    Microsoft Corporation 
    2002 年 1 月 摘要:本文介绍如何使用 Visual Basic? .NET 和 Visual C#? .NET 创建和管理控件数组。 目录
    简介 
    前提 
    创建项目 
    实现集合 
    公开控件数组 
    创建公共事件处理程序 
    测试项目 
    总结 
    简介
    数组为使用共享公共功能的控件组提供了一种方便的方式。例如,控件组可以用来显示相关数据,或者在单击时提供相关的操作。Visual Basic .NET 和 C# 本身并不支持创建控件数组,但您可以通过编程来复制控件数组的全部功能。本文将指导您创建一个复制控件数组功能的简单组件。控件数组的某些用处如下所示: 通过索引访问具有相同名称的控件集合,您可以按编号检索和设置属性,并遍历数组中的所有控件。这一操作的典型语法如下:
    ' Visual Basic 伪代码
    MyControl(myIndex).MyProperty = myValue
    MyControl(myIndex + 1).MyMethod// C# 伪代码
    myControl[myIndex].myProperty = myValue;
    myControl[myIndex + 1].myMethod
    使用单个事件处理程序处理多个控件的事件,检索并使用这些事件中的索引,如下例所示:
    ' Visual Basic 伪代码
    Private Sub MyControl_Click(sender as Object, e as EventArgs)
       Messagebox.Show("您已单击 MyControl 编号" & _
          MyControl.Index)
    End Sub// C# 伪代码
    private void myControl_Click(System.Object sender, System.EventArgs e)
       {
          Messagebox.Show("您已单击 MyControl 编号" +
             MyControl.Index);
       }
    在运行时动态添加或删除控件,如下所示:
    ' Visual Basic 伪代码
    Dim i as Integer
    For i = 1 to 5
       ' 插入代码以创建控件并为属性分配值。
    Next i// C# 伪代码
    for (int i = 1; i < 6; i++)
    {
       // 插入代码以创建控件并为属性分配值。 
    }
    Visual Basic .NET 和 C# 允许您复制部分此类功能,例如,使用代理将多个控件中的事件绑定到单个事件处理程序。但是,如果将该功能并入单个动态的、易于管理的组件,可能会更方便。本文中,我们将创建使用以下内容的组件: 索引和排序控件的集合。按钮集合将用于演示。 
    处理来自派生按钮的单击事件的事件处理程序。 
    允许通过索引引用控件及其成员的代码。 
    在窗体中动态添加和删除控件的代码。 
    前提
    熟悉组件及其工作原理。 
    对多态有所了解。有关详细信息,请参阅 Polymorphism in Components(英文)。 
    了解 Visual Basic .NET 或 C# .NET 语法。 
    创建项目
    本节中,我们将创建和命名项目,并在项目中添加一个类。该类将封装实现控件数组的代码。创建 ButtonArrayProject 和 ButtonArray 组件 在 File(文件)菜单上,指向 New(新建),然后选择 Project(项目)以打开 New Project(新建项目)对话框。 
    从 Visual Basic 或 Visual C# 项目列表中选择 Windows Application(Windows 应用程序)项目模板,并在 Name(名称)框中键入 ButtonArrayProject。 
    从 File(文件)菜单中,选择 Save All(全部保存)以保存项目。 
    实现集合
    ButtonArray 类将通过实现集合来完成支持和组织控件数组的任务。集合是一个对象,它包含经过索引的对象变量的列表,以及在集合中添加、删除或者操作对象的方法。本节中,我们将创建继承自 System.Collections.CollectionBase(.NET 框架中的类,提供集合所需的很多功能)的类,并实现提供所需功能的方法。创建继承的类 从 Project(项目)菜单中,选择 Add Class(添加类)。 
    相应地将类命名为 ButtonArray.vb 或 ButtonArray.cs。 
    将打开包含该类的 Code Editor(代码编辑器)。 在类声明中,指定此类是从 .NET 框架的 System.Collections.CollectionBase 类继承而来的。
    ' Visual Basic
    Public Class ButtonArray
       Inherits System.Collections.CollectionBase
    End Class// C#
    public class ButtonArray : System.Collections.CollectionBase
    {
       // 省略了由设计器添加的代码。
    }
    System.Collections.CollectionBase 类提供集合所需的许多功能。其中包括 List 对象(跟踪集合所包含的对象)、Count 属性(维护当前集合中的对象总数)和 RemoveAt 方法(按特定索引删除对象)。在实现控件数组集合时,要用到这些功能。由于所有控件数组组件都要与一个窗体相关联,因此需要添加一个字段以保留对该窗体的引用。通过创建专用的只读字段来保留该引用,可以确保每个控件数组组件只与一个窗体相关联。在组件中添加专用的只读字段 直接在类声明中添加以下行:
    ' Visual Basic
    Private ReadOnly HostForm as System.Windows.Forms.Form// C#
    private readonly System.Windows.Forms.Form HostForm;
    必须在集合中实现的第一个方法是 AddNewButton。此方法将创建新的按钮控件,并将其添加到所需的窗体中。还需要使用此方法设置新按钮的初始属性。实现 AddNewButton 方法 在包含 ButtonArray 类的 Code Editor(代码编辑器)中,键入以下代码:
    Public Sub AddNewButton()
       ' 创建 Button 类的新实例。
       Dim aButton As New System.Windows.Forms.Button()
       ' 将按钮添加到集合的内部列表。
       Me.List.Add(aButton)
       ' 将按钮添加到由 HostForm 字段 
       ' 引用的窗体的控件集合中。
       HostForm.Controls.Add(aButton)
       ' 设置按钮对象的初始属性。
       aButton.Top = Count * 25
       aButton.Left = 100
       aButton.Tag = Me.Count
       aButton.Text = "按钮 " & Me.Count.ToString
    End Sub// C# 
    public void AddNewButton()
    {
       // 创建 Button 类的新实例。
       System.Windows.Forms.Button aButton = new 
          System.Windows.Forms.Button();
       // 将按钮添加到集合的内部列表。
       this.List.Add(aButton);
       // 将按钮添加到由 HostForm 字段 
       // 引用的窗体的控件集合中。
       HostForm.Controls.Add(aButton);
       // 设置按钮对象的初始属性。
       aButton.Top = Count * 25;
       aButton.Left = 100;
       aButton.Tag = this.Count;
       aButton.Text = "按钮 " + this.Count.ToString();
    }
    此方法将: 创建新按钮。 
    将新按钮添加到内部列表和由 HostForm 引用的窗体的控件集合中。 
    设置初始属性,包括将 Tag 属性设置为按钮的索引。您可以在本节中添加代码以设置控件的其他属性。 
    还必须创建一个构造函数(对组件进行实例化时运行的方法),用于设置 HostForm 字段的值,并且只要创建控件数组类的新实例,便可自动在窗体中添加新按钮。您可以通过以下方式完成此任务。创建构造函数 创建类的构造函数。
    ' Visual Basic
    Public Sub New(ByVal host as System.Windows.Forms.Form)
       HostForm = host
       Me.AddNewButton()
    End Sub// C# 
    // 使用此构造函数替换默认的构造函数。
    public ButtonArray(System.Windows.Forms.Form host)
    {
       HostForm = host;
       this.AddNewButton();
    }
    构造函数需要一个参数,即放置按钮数组的窗体。它指定提供给 HostForm 字段的值,然后调用类的 AddNewButton 方法在窗体中添加新按钮。 公开控件数组
    您已经创建了一种方法在数组中创建和跟踪控件,现在需要向其他开发人员公开这些控件。可以使用一个属性来执行此操作。您将创建一个默认属性 (Visual Basic) 或索引程序 (C#),根据索引返回一个对特定按钮的引用。这也使您能够通过编程方式使用控件数组的典型 MyButtonArray(myIndex) 语法。创建默认属性 在组件中添加以下代码。
    ' Visual Basic
    Default Public ReadOnly Property Item(ByVal Index As Integer) As _
       System.Windows.Forms.Button
       Get
          Return CType(Me.List.Item(Index), System.Windows.Forms.Button)
       End Get
    End Property// C#
    public System.Windows.Forms.Button this [int Index]
    {
    get
       {
          return (System.Windows.Forms.Button) this.List[Index];
       }
    }
      

  11.   

    在 Visual Basic .NET 和 Visual C# .NET 中创建控件数组Matthew A. Stoecker
    Visual Studio Team
    Microsoft Corporation 
    2002 年 1 月 摘要:本文介绍如何使用 Visual Basic? .NET 和 Visual C#? .NET 创建和管理控件数组。 目录
    简介 
    前提 
    创建项目 
    实现集合 
    公开控件数组 
    创建公共事件处理程序 
    测试项目 
    总结 
    简介
    数组为使用共享公共功能的控件组提供了一种方便的方式。例如,控件组可以用来显示相关数据,或者在单击时提供相关的操作。Visual Basic .NET 和 C# 本身并不支持创建控件数组,但您可以通过编程来复制控件数组的全部功能。本文将指导您创建一个复制控件数组功能的简单组件。控件数组的某些用处如下所示: 通过索引访问具有相同名称的控件集合,您可以按编号检索和设置属性,并遍历数组中的所有控件。这一操作的典型语法如下:
    ' Visual Basic 伪代码
    MyControl(myIndex).MyProperty = myValue
    MyControl(myIndex + 1).MyMethod// C# 伪代码
    myControl[myIndex].myProperty = myValue;
    myControl[myIndex + 1].myMethod
    使用单个事件处理程序处理多个控件的事件,检索并使用这些事件中的索引,如下例所示:
    ' Visual Basic 伪代码
    Private Sub MyControl_Click(sender as Object, e as EventArgs)
       Messagebox.Show("您已单击 MyControl 编号" & _
          MyControl.Index)
    End Sub// C# 伪代码
    private void myControl_Click(System.Object sender, System.EventArgs e)
       {
          Messagebox.Show("您已单击 MyControl 编号" +
             MyControl.Index);
       }
    在运行时动态添加或删除控件,如下所示:
    ' Visual Basic 伪代码
    Dim i as Integer
    For i = 1 to 5
       ' 插入代码以创建控件并为属性分配值。
    Next i// C# 伪代码
    for (int i = 1; i < 6; i++)
    {
       // 插入代码以创建控件并为属性分配值。 
    }
    Visual Basic .NET 和 C# 允许您复制部分此类功能,例如,使用代理将多个控件中的事件绑定到单个事件处理程序。但是,如果将该功能并入单个动态的、易于管理的组件,可能会更方便。本文中,我们将创建使用以下内容的组件: 索引和排序控件的集合。按钮集合将用于演示。 
    处理来自派生按钮的单击事件的事件处理程序。 
    允许通过索引引用控件及其成员的代码。 
    在窗体中动态添加和删除控件的代码。 
    前提
    熟悉组件及其工作原理。 
    对多态有所了解。有关详细信息,请参阅 Polymorphism in Components(英文)。 
    了解 Visual Basic .NET 或 C# .NET 语法。 
    创建项目
    本节中,我们将创建和命名项目,并在项目中添加一个类。该类将封装实现控件数组的代码。创建 ButtonArrayProject 和 ButtonArray 组件 在 File(文件)菜单上,指向 New(新建),然后选择 Project(项目)以打开 New Project(新建项目)对话框。 
    从 Visual Basic 或 Visual C# 项目列表中选择 Windows Application(Windows 应用程序)项目模板,并在 Name(名称)框中键入 ButtonArrayProject。 
    从 File(文件)菜单中,选择 Save All(全部保存)以保存项目。 
    实现集合
    ButtonArray 类将通过实现集合来完成支持和组织控件数组的任务。集合是一个对象,它包含经过索引的对象变量的列表,以及在集合中添加、删除或者操作对象的方法。本节中,我们将创建继承自 System.Collections.CollectionBase(.NET 框架中的类,提供集合所需的很多功能)的类,并实现提供所需功能的方法。创建继承的类 从 Project(项目)菜单中,选择 Add Class(添加类)。 
    相应地将类命名为 ButtonArray.vb 或 ButtonArray.cs。 
    将打开包含该类的 Code Editor(代码编辑器)。 在类声明中,指定此类是从 .NET 框架的 System.Collections.CollectionBase 类继承而来的。
    ' Visual Basic
    Public Class ButtonArray
       Inherits System.Collections.CollectionBase
    End Class// C#
    public class ButtonArray : System.Collections.CollectionBase
    {
       // 省略了由设计器添加的代码。
    }
    System.Collections.CollectionBase 类提供集合所需的许多功能。其中包括 List 对象(跟踪集合所包含的对象)、Count 属性(维护当前集合中的对象总数)和 RemoveAt 方法(按特定索引删除对象)。在实现控件数组集合时,要用到这些功能。由于所有控件数组组件都要与一个窗体相关联,因此需要添加一个字段以保留对该窗体的引用。通过创建专用的只读字段来保留该引用,可以确保每个控件数组组件只与一个窗体相关联。在组件中添加专用的只读字段 直接在类声明中添加以下行:
    ' Visual Basic
    Private ReadOnly HostForm as System.Windows.Forms.Form// C#
    private readonly System.Windows.Forms.Form HostForm;
    必须在集合中实现的第一个方法是 AddNewButton。此方法将创建新的按钮控件,并将其添加到所需的窗体中。还需要使用此方法设置新按钮的初始属性。实现 AddNewButton 方法 在包含 ButtonArray 类的 Code Editor(代码编辑器)中,键入以下代码:
    Public Sub AddNewButton()
       ' 创建 Button 类的新实例。
       Dim aButton As New System.Windows.Forms.Button()
       ' 将按钮添加到集合的内部列表。
       Me.List.Add(aButton)
       ' 将按钮添加到由 HostForm 字段 
       ' 引用的窗体的控件集合中。
       HostForm.Controls.Add(aButton)
       ' 设置按钮对象的初始属性。
       aButton.Top = Count * 25
       aButton.Left = 100
       aButton.Tag = Me.Count
       aButton.Text = "按钮 " & Me.Count.ToString
    End Sub// C# 
    public void AddNewButton()
    {
       // 创建 Button 类的新实例。
       System.Windows.Forms.Button aButton = new 
          System.Windows.Forms.Button();
       // 将按钮添加到集合的内部列表。
       this.List.Add(aButton);
       // 将按钮添加到由 HostForm 字段 
       // 引用的窗体的控件集合中。
       HostForm.Controls.Add(aButton);
       // 设置按钮对象的初始属性。
       aButton.Top = Count * 25;
       aButton.Left = 100;
       aButton.Tag = this.Count;
       aButton.Text = "按钮 " + this.Count.ToString();
    }
    此方法将: 创建新按钮。 
    将新按钮添加到内部列表和由 HostForm 引用的窗体的控件集合中。 
    设置初始属性,包括将 Tag 属性设置为按钮的索引。您可以在本节中添加代码以设置控件的其他属性。 
    还必须创建一个构造函数(对组件进行实例化时运行的方法),用于设置 HostForm 字段的值,并且只要创建控件数组类的新实例,便可自动在窗体中添加新按钮。您可以通过以下方式完成此任务。创建构造函数 创建类的构造函数。
    ' Visual Basic
    Public Sub New(ByVal host as System.Windows.Forms.Form)
       HostForm = host
       Me.AddNewButton()
    End Sub// C# 
    // 使用此构造函数替换默认的构造函数。
    public ButtonArray(System.Windows.Forms.Form host)
    {
       HostForm = host;
       this.AddNewButton();
    }
    构造函数需要一个参数,即放置按钮数组的窗体。它指定提供给 HostForm 字段的值,然后调用类的 AddNewButton 方法在窗体中添加新按钮。 公开控件数组
    您已经创建了一种方法在数组中创建和跟踪控件,现在需要向其他开发人员公开这些控件。可以使用一个属性来执行此操作。您将创建一个默认属性 (Visual Basic) 或索引程序 (C#),根据索引返回一个对特定按钮的引用。这也使您能够通过编程方式使用控件数组的典型 MyButtonArray(myIndex) 语法。创建默认属性 在组件中添加以下代码。
    ' Visual Basic
    Default Public ReadOnly Property Item(ByVal Index As Integer) As _
       System.Windows.Forms.Button
       Get
          Return CType(Me.List.Item(Index), System.Windows.Forms.Button)
       End Get
    End Property// C#
    public System.Windows.Forms.Button this [int Index]
    {
    get
       {
          return (System.Windows.Forms.Button) this.List[Index];
       }
    }
      

  12.   

    删除行就是把
    ViewState["Table1RowCount"] = ViewState["Table1RowCount"] -1;
    同时注意数据的处理
    比如上出第二行需要从最后一行开始将TextBox中数据负值到上一行的TextBox中
      

  13.   

    for (int i = 要删除的行Index;i<(int)ViewState["Table1RowCount"];i ++)
    {
       ((TextBox)this.FindControl("txt"+i.ToString)).Text = ((TextBox)this.FindControl("txt"+(i+1).ToString)).Text
    }
      

  14.   

    to princeml() click event write in your usercontrol