【问题标题】:Find all textbox control in a page查找页面中的所有文本框控件
【发布时间】:2011-11-13 23:48:30
【问题描述】:

我正在尝试使用 http 模块来禁用每个页面的文本框。这是我的示例编码

  public void context_OnPreRequestHandlerExecute(object sender, EventArgs args)
    {
        try
        {
            HttpApplication app = sender as HttpApplication;
            if (app != null)
            {
                Page page = app.Context.Handler as Page;
                if (page != null)
                {
                    page.PreRender += OnPreRender;
                    page.PreLoad += onPreLoad;
                }
            }



        }
        catch (Exception ex)
        {
            throw new ApplicationException(ex.Message);
        }
    }


    public void OnPreRender(object sender, EventArgs args)
    {
        Page page = sender as Page;
        if (page.IsCrossPagePostBack)
        {
            DisableAllTextBoxes(page);
        }

    }

    private static void DisableAllTextBoxes(Control parent)
    {

        foreach (Control c in parent.Controls)
        {
            var tb = c as Button;
            if (tb != null)
            {
                tb.Enabled = false;
            }
            DisableAllTextBoxes(c);
        }

    }

这种编码可以很好地工作,但是当我使用 server.transer 到另一个页面时。按钮无法禁用。 例如 webform1 转移到 webform2。 Webform 1 的按钮可以禁用,但 webform2 不能禁用。谁能解决我的问题?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    Server.Transfer 确实 不 遍历所有 http 模块管道(这就是为什么不为您执行 context_OnPreRequestHandlerExecute 的原因)

    你应该试试Server.TransferRequest或response.redirect或HttpContext.Current.RewritePath

    【讨论】:

      【解决方案2】:
      • 使用 LINQ 获取所有文本框控件。
      • 不要使用Server.Transfer()

      在 ControlCollection 上创建一个返回 IEnumerable 的扩展方法。处理递归。然后你可以像这样在你的页面上使用它:

      var textboxes = this.Controls.FindAll().OfType<TextBox>();
      
      foreach (var t in textboxes)
      { 
          t.Enabled = false;
      }
      

      ...

      public static class Extensions
      {
      public static IEnumerable<Control> FindAll(this ControlCollection collection)
      {
          foreach (Control item in collection)
          {
              yield return item;
      
              if (item.HasControls())
              {
                  foreach (var subItem in item.Controls.FindAll())
                  {
                      yield return subItem;
                  }
              }
          }
      }
      }
      

      取自this answer。

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 2016-06-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多