2011-11-13 26 views
3

我正在嘗試使用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無法禁用。有誰能解決我的問題嗎?

回答

0

Server.Transfer DOES NOT 通過所有的HTTP模塊pipline

你應該嘗試(爲什麼context_OnPreRequestHandlerExecute不是爲你執行這就是)Server.TransferRequestresponse.redirectHttpContext.Current.RewritePath

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服用。

相關問題