在页面中查找所有文本框控件

时间:2011-11-13 15:33:59

标签: asp.net

我正在尝试使用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无法禁用。谁能解决我的问题?

2 个答案:

答案 0 :(得分:0)

  • 使用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

答案 1 :(得分:0)

Server.Transfer是否通过所有http模块管道(这就是为什么不执行context_ PreRequestHandlerExecute)

您应该尝试Server.TransferRequestresponse.redirectHttpContext.Current.RewritePath