表格文本框在回发时失去价值

时间:2013-02-14 21:40:12

标签: asp.net vb.net

我在网上找到了一些代码,可以动态地向表中添加新行http://geekswithblogs.net/dotNETvinz/archive/2009/06/29/faq-dynamically-adding-rows-in-asp-table-on-button-click.aspx。该行将被添加,之前的所有数据都将消失。从评论看来,很多人都有这个问题。

ASPX

    <asp:UpdatePanel ID="upMaterial" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="true">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="Button1" EventName ="Click" />
    </Triggers>
    <ContentTemplate>
        <asp:Table ID="tbMaterials" runat="server" GridLines="Both" Visible="false">
            <asp:TableRow>
                <asp:TableCell>Qty</asp:TableCell>
                <asp:TableCell>Material</asp:TableCell>
                <asp:TableCell>Cost</asp:TableCell>
                <asp:TableCell>Price</asp:TableCell>
                <asp:TableCell>Total</asp:TableCell>
            </asp:TableRow>
        </asp:Table>
        <asp:Button ID="Button1" runat="server" Text="Button" />
    </ContentTemplate>
</asp:UpdatePanel>

VB

Public Class _Default
Inherits System.Web.UI.Page
Private numOfRows As Integer = 1

Protected Sub Page_Load(sender As Object, e As EventArgs)
    If Not Page.IsPostBack Then
        ViewState("RowsCount") = 1
    End If
End Sub

Protected Sub addRow(sender As Object, e As EventArgs) Handles Button1.Click
    'adds the column row once we know the header row is there
    If ViewState("RowsCount") IsNot Nothing Then
        tbMaterials.Visible = True
        numOfRows = Convert.ToInt32(ViewState("RowsCount").ToString)
        GenerateTable(numOfRows)
    End If
End Sub

Private Sub GenerateTable(rowsCount As Integer)
    'Creat the Table and Add it to the Page

    Dim table As Table = tbMaterials

    'The number of Columns to be generated
    Const colsCount As Integer = 5
    'You can changed the value of 3 based on you requirements

    ' Now iterate through the table and add your controls
    For i As Integer = 0 To rowsCount - 1
        Dim row As New TableRow()

        For j As Integer = 0 To colsCount - 1
            Dim cell As New TableCell()
            Dim tb As New TextBox()

            ' Set a unique ID for each TextBox added
            tb.ID = "TextBoxRow_" + i.ToString + "Col_" + j.ToString
            ' Add the control to the TableCell
            cell.Controls.Add(tb)
            ' Add the TableCell to the TableRow
            row.Cells.Add(cell)
        Next

        ' And finally, add the TableRow to the Table
        table.Rows.Add(row)
    Next
    'Set Previous Data on PostBacks
    SetPreviousData(rowsCount, colsCount)
    'Sore the current Rows Count in ViewState
    rowsCount += 1
    ViewState("RowsCount") = rowsCount
End Sub
Private Sub SetPreviousData(rowsCount As Integer, colsCount As Integer)
    Dim table As Table = tbMaterials
    If table IsNot Nothing Then
        For i As Integer = 0 To rowsCount - 1
            For j As Integer = 0 To colsCount - 1
                'Extracting the Dynamic Controls from the Table
                Dim tb As TextBox = DirectCast(table.Rows(i).Cells(j).FindControl("TextBoxRow_" + i.ToString + "Col_" + j.ToString), TextBox)
                'Use Request objects for getting the previous data of the dynamic textbox
                tb.Text = Request.Form("TextBoxRow_" + i.ToString + "Col_" + j.ToString)
            Next
        Next
    End If
End Sub

1 个答案:

答案 0 :(得分:0)

如果您使用获取表单变量的ID与您在tb.Text中使用的变量名称相同,可以使用浏览器中的查看源进行检查吗(TextBoxRow_“+ i.ToString +” Col_“+ j.ToString)。因为我们不能将id用于请求变量。