在后面的代码中创建表行

时间:2013-02-20 17:12:46

标签: c# asp.net

有人可以帮我理解这里需要做什么,因为我是C#的新手。

我有一个带有两个按钮和几个文本框的表单。

首先,用户在其中一个文本框中输入一个数字,然后按下其中一个按钮。这样的形式也是空的:

<asp:Table id="tblInputs" runat="server" Border="1" Width="100%">
</asp:Table>

因此,当用户点击第一个按钮时,后面的代码将向该表添加尽可能多的行,即文本框中的输入,如下所示:

for (int i = 0; i < numOfInputFields; i++) 
{
    TableRow row = new TableRow ();
    TableCell cell_inputA = new TableCell ();
    TableCell cell_inputB = new TableCell ();

    TextBox txtBox_input = new TextBox ();

    txtBox_input.ID = "txtInFld" + (i + 1);
    txtBox_input.Text = txtBox_input.ID;
    cell_inputA.Text = "Input " + (i + 1);
    cell_inputB.Controls.Add (txtBox_input);

    row.Cells.Add (cell_inputA);
    row.Cells.Add (cell_inputB);

    tblInputs.Rows.Add (row);
}

现在到目前为止,这样可以正常工作,并且可以很好地创建列和行。

我现在的问题是,由于文本框的ID是在上面的代码隐藏中创建的,我如何从其他代码隐藏函数中访问它们。

在我提到的帖子的顶部,我有一个相同形式的另一个按钮,只是更改了一个新创建的文本框中的文本值,但它不起作用。

说txtInFld1.Text =“某事”的常规方式;不再工作,因为即使它已经在上面创建,它也看不到txtInFld1。我得到“名称'txtInFld1'在当前上下文中不存在”。我怀疑它与重新提交相同的表格有关,但我不确定。

任何人都可以解释这里发生了什么,以及如何访问在代码隐藏中创建的新文本框的属性?

由于

2 个答案:

答案 0 :(得分:0)

动态创建的控件在开始时有点难以理解。

1)您需要在ViewState中保存ID以在回发后保留数据。

2)然后在回发页面时重新创建这些文本框。否则,您将无法访问它。

以下是类似的答案(该问题使用UserControl而不是TextBox) -

https://stackoverflow.com/a/14449305/296861

答案 1 :(得分:0)

您可以递归地挖掘表格的控件集合,直到找到子控件。

传入父控件,然后传入您要查找的控件的ID。

干杯, 〜Codewolfe

    private System.Web.UI.Control FindControlRecursive(Control root, string id)
    {
        if (root.ID == id)
        {
            return root;
        }

        foreach (Control c in root.Controls)
        {
            Control t = FindControlRecursive(c, id);
            if (t != null)
            {
                return t;
            }
        }

        return null;
    }