【问题标题】:How to find a control recursively in ASP.NET如何在 ASP.NET 中递归查找控件
【发布时间】:2015-10-28 18:43:25
【问题描述】:

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

我的 HTML 标记中有一个空的 asp:table:

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

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

你猜对了,我需要获取这些文本框的值!

(我已经拿到了递归的代码,检查了一下,看起来不错。)

我的表有两列。左侧包含“公司名称、电话”等标题,右侧列包含带有相应标题值的文本框。因此用户可以编辑文本框(例如,如果电话号码发生变化)并提交更改。

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

我遇到的问题是:您需要在填充表格时将控件添加到页面。大致如下:

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);
        }
    }
}

【问题讨论】:

  • 不喜欢Control.FindControl 方法,这基本上是为您完成所有这些?或者您没有要获取的 ID?
  • Control.FindControl 不会在所有控件中递归。只有页面控件。反正没有身份证
  • 您可以根据行号和列号生成ID。
  • 来个漂亮的recursive FindControl 怎么样?
  • @R0MANARMY:我只能想到这种方法完全可行的 Intranet 环境。但即使有 100 个人问我为什么 WebApplication 不能像 WinForm-App 那样运行,我也不会这样做。我在 TextChanged 上完成自动更新的单一案例是一个时间紧迫的 Intranet 应用程序,适用于少数使用条形码扫描仪并按计件系统付费的人。

标签: c# asp.net dynamic-data


【解决方案1】:

这是一个在页面加载期间在 ASP.NET 中构建动态表并通过回发读取值的示例。由于表是动态的,所以当页面回发到服务器时,它不会被重建。如果你想重建表格,你需要再次渲染它并使用你从 Request.Form 中提取的值来重新填充它。

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>");
            }
        }
    }

【讨论】:

    【解决方案2】:

    您需要将TableCell 添加到TableRow.Cells 集合,并将TextBox 添加到TableCell.Controls 集合:

    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,而无需在树中搜索它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2023-03-29
      • 2011-01-12
      相关资源
      最近更新 更多