2

有人可以帮我理解这里需要做什么,因为我是 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 = "something"; 的常规方式 不再起作用,因为它看不到 txtInFld1 即使它已经在上面创建。我得到“当前上下文中不存在名称'txtInFld1'”。我怀疑这与重新提交相同的表格有关,但我不确定。

谁能解释一下这里发生了什么以及如何访问在代码隐藏中创建的新文本框的属性?

谢谢

4

2 回答 2

0

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

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

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

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

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

于 2013-02-20T17:36:13.317 回答
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;
    }
于 2014-06-16T23:28:59.457 回答