如何在ASP.NET中递归地查找控件

本文关键字:递归 查找 控件 NET ASP | 更新日期: 2023-09-27 18:04:29

这方面有很多例子,我对使用递归找到控件的概念非常熟悉。一旦在回发中找到控件,就可以与它进行交互,等等。

我有一个空的asp:表在我的HTML标记:

<asp:Table ID="editDataTable" runat="server">
</asp:Table>

在Page_Load上,表被填充了许多行和许多列(我很自豪我发现了这一点)。在一些表格单元格中有一个<asp:TextBox /> .

你已经猜到了,我需要得到这些文本框的值!

(我已经得到了递归的代码并检查了它,看起来很好。)

我的表有两列。左边一列包含"公司名称、电话"等标题,右边一列包含带有各自标题值的文本框。因此,用户可以编辑文本框(例如,如果电话号码发生了更改)并提交更改。

显然,行是根据用户动态添加的。

我遇到的问题是:您需要在填充表时将控件添加到页面。类似以下语句:

myTable.Control.Add(new TextBox());

在我的例子中,我的表被称为editDataTable。因此,在我添加行的代码中,我也添加了控件,如下所示。

for (int i = 0; i < rowCount; i++)
{
    editDataTable.Rows.Add(tblRow[j]); // This is where I add the ROW to my sexy table
    editDataTable.Controls.Add(new TextBox()); // This is where I add the control
}

那些醒着的你会知道,你不能添加一个文本框控件到一个表!

最后,我的问题是:

  • 如何在表中添加文本框控件?
  • 我在哪里添加它们?
  • 是否有任何额外的建议来帮助我完成我的任务,检索我动态添加的文本框的文本值?
这里是我的递归代码,以防你好奇:
private void getControls(Control parent)
{
    foreach (Control c in parent.Controls)
    {
        if (c is TextBox && c.ID == null)
        {
            //Stuff
        }
        if (c.Controls.Count > 0)
        {
            getControls(c);
        }
    }
}

如何在ASP.NET中递归地查找控件

下面是一个在ASP中构建动态表的示例。. NET页面加载期间,并通过回发读取值。由于表是动态的,所以当页面回发到服务器时不会重新构建表。如果要重新构建表,则需要再次呈现表并使用从Request中获取的值。表单重新填充。

HTML标记

    <asp:Table ID="editDataTable" runat="server">
    </asp:Table>
    <asp:Button runat="server" Text="Submit" OnClick="Submit_Click" />

代码标记

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string[] dynamicTable = { "First Name", "Last Name", "Address", "Phone" };
            foreach (string s in dynamicTable)
            {
                TableRow row = new TableRow();
                // Add First Cell with Text to Row
                row.Cells.Add(new TableCell() { Text = s });
                // Create Second Cell
                TableCell textBoxCell = new TableCell();
                // Add Textbox Control to Second Cell
                textBoxCell.Controls.Add(new TextBox() { ID = "Dynamic_" + s.Replace(" ","_") });
                // Add Second Cell to Row
                row.Cells.Add(textBoxCell);
                // Add New Row to Table
                editDataTable.Rows.Add(row);
            }
        }
    }
    protected void Submit_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < Request.Form.Count; i++)
        {
            string key = Request.Form.GetKey(i);
            if (key.Contains("Dynamic_"))
            {
                Response.Write("<p><strong>" + (key.Remove(0,8)).Replace("_"," ") + "</strong>&nbsp;&nbsp;::&nbsp;&nbsp;" + Request.Form[i] + "</p>");
            }
        }
    }

需要在TableRow.Cells集合中添加一个TableCell,在TableCell.Controls集合中添加一个TextBox:

TableCell cell = new TableCell();
cell.Controls  = new TextBox();
tblRow[j].Cells.Add(cell);
editDataTable.Rows.Add(tblRow[j]);

访问文本框最直接的方法是将它们全部保存在一个列表中:

List<TextBox> textBoxes = new List<TextBox>();

并将上面的cell.Controls = new TextBox();替换为:

TextBox tb = new TextBox();
textBoxes.Add(tb);
cell.Controls = tb;

然后你可以遍历textBoxes,而不必在树中搜索它们。