【问题标题】:How to Dynamically get All controls (and it's IDs) in an aspx Page?如何在 aspx 页面中动态获取所有控件(及其 ID)?
【发布时间】:2009-05-17 21:24:43
【问题描述】:

您好,我需要根据要执行的服务动态激活页面中的字段...

让我解释一下:

有一个包含所有可能字段的页面和一个包含所有要执行的选定服务的列表框,然后当用户选择要执行的服务(例如更改车牌)时,我只需要激活该字段(s) 服务需要...(服务和字段之间的关系存储在数据库中)。

public void CheckAll(int pService_Id, Control pPage)
{

    foreach (Control control in pPage.Controls)
    {
        busExecutaServico vExecuta = new busExecutaServico();

        if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue)))
        {
            switch (control.GetType().ToString())
            {
                case "TextBox":
                    TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString());
                    controleText.Enabled = true;
                    break;

请注意,busExecutaServico 是包含方法 (EnableField) 的类,用于检查所选项目是否与数据库中的任何字段匹配..

我似乎无法让 control.ID.ToString() 正常工作(ID 始终为 NULL)

如果有人可以帮助我解决这个问题,或者如果有其他方法(即使它与我正在尝试的完全不同),那将有很大帮助。谢谢

【问题讨论】:

    标签: c# asp.net visual-studio-2008


    【解决方案1】:

    我喜欢使用递归函数来按类型或 ID 定位控件。

    public Control FindControlRecursive(Control rootControl, string controlId)
    {
        if (rootControl.ID == controlId)
            return rootControl;
    
        foreach (Control control in rootControl.Controls)
        {
            Control foundControl = FindControlRecursive(control, controlId);
            if (foundControl != null)
            {
                return foundControl;
            }
        }
    
        return null;
    }
    
    public Control FindControlRecursive(Control rootControl, Type type)
    {
        if (rootControl.GetType().Equals(type))
            return rootControl;
    
        foreach (Control control in rootControl.Controls)
        {
            Control foundControl = FindControlRecursive(control, type);
            if (foundControl != null)
            {
                return foundControl;
            }
        }
    
        return null;
    }
    

    您可以调整这些以首先返回一组控件,然后再处理它们。可能更容易跟踪正在发生的事情。

    我在这里学到了这项技术:http://www.west-wind.com/Weblog/posts/5127.aspx

    【讨论】:

      【解决方案2】:

      请注意,FindControl 仅搜索当前命名容器,因此 Page.FindControl 将仅查找直接添加到 Page 的控件。例如,如果您有一个转发器控件,其中包含您要查找的控件并将其添加到 Page,您可以通过 Page.FindControl 找到您的转发器控件,但它不会在您的转发器中找到子控件,您将拥有对页面中的所有容器控件递归执行 FindControl。

      这可能看起来有点奇怪,但它允许您在同一页面上拥有具有相同 ID 的控件。例如,如果您有 10 个用户控件实例,其中包含名为“MyName”的文本框,那么您真的希望它们不会覆盖彼此的“MyName”字段!

      【讨论】:

      【解决方案3】:

      除非为每个控件指定了 ID,否则您的代码将遇到 ID 为 null。

      还有为什么要使用:-

      TextBox controleText = (TextBox)Page.FindControl(control.ID.ToString());
      

      完全不是:-

      TextBox controleText = (TextBox)control;
      

      事实上,既然您只想更改 Enabled 属性,请考虑:-

      ((WebControl)control).Enabled = False;
      

      我怀疑这会消除许多案例陈述。

      【讨论】:

        【解决方案4】:

        在您的代码中,您不需要搜索任何控件 - 您已经在“控件”变量中拥有它。您甚至不需要将其转换为 TextBox,只需转换为 WebControl,只需这样做:

        ...
        if (vExecuta.EnableField(control.ID.ToString(), Convert.ToInt32(listBoxServices.SelectedValue)))
            ((WebControl)control).Enabled = true;
        

        附: control.ID 已经是字符串,因此您也应该删除任何 ID.ToString()。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-08
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 2020-01-16
          • 2010-09-16
          相关资源
          最近更新 更多