2011-08-11 51 views
1

就拿這個簡單的例子,例如:ASP.NET 3.5:當禁用父控件時,如何禁止beind禁用子控件?

<asp:Panel ID="pnlTest" runat="server"> 
    <asp:TextBox ID="txPanelText" Text="Text" runat="server" /> 
</asp:Panel> 

現在,在代碼隱藏,這樣做:

pnlTest.Enabled = false; 
txPanelText.Enabled = true; 

爲什麼禁用面板內也禁止它的文本?此外,爲什麼明確啓用文本框不起作用?

這顯然與ASP.NET框架有關。有什麼辦法可以避免這種情況嗎?

注意:這不是我在我的應用程序中使用的實際代碼。這只是一個例子,展示如何禁用控件也遞歸地禁用其中的所有子控件。

+0

很明顯,如果你禁用面板,它的一切都將被禁用 - 這是設計。 – IrishChieftain

+0

你的標題說如何禁用控制面板,但在它說你需要啓用控制與禁用面板的問題 –

+0

IrishChieftain - 對,我知道它必須是框架相關的,因此我的問題是「有什麼辦法我可以避免這一點?「。 Jayantha - 對。這些控件被自動禁用,所以我上面的代碼示例說明了我在事後如何強制啓用它們。 – oscilatingcretin

回答

1

這是通過設計,並達到您正在尋找的效果需要使用不同的方法。我會建議遞歸迭代通過子控件並使用一些邏輯來確定哪些控件被禁用,哪些不控制。

0

你可以在客戶端使用javascript來做到這一點。

var controls = document.getElementById("<%=pnlTest.ClientID%>").getElementsByTagName("input"); 

for (var i = 0; i < controls.length; i++) 
    controls[i].disabled = true; 
+0

請記住,我給出的例子只是一個簡單的例子。我們實際應用程序中的控件層次結構包含許多不同類型的控件。此外,一些控制措施必須保持禁用狀態,所以我們無法做出無條件的強力使每個兒童控制。我可以看到讓這個工作起作用的唯一方法是遞歸獲取所有已啓用的子控件的集合,然後在事實之後在客戶端重新啓用它們,但是我希望不必採取僅僅是理論的這種攻擊在此刻。 – oscilatingcretin

0

這是因爲如果控件或父樹中的任何控件都將Enabled設置爲False,則控件具有名爲IsEnabled的額外內部屬性,該屬性返回False。在渲染過程中,如果此IsEnabled屬性爲False,則TextBox會添加禁用的屬性。

您可以通過繼承Panel和TextBox控件並添加自己的屬性和邏輯來創建自己的自定義控件。像我下面的東西應該工作。

此外,我不會推薦渲染Panel上的disabled屬性,該屬性呈現爲div。 disabled屬性不是div的標準html屬性,瀏覽器不一致地呈現內容。例如,IE 9調暗內部文本框(如果文本框沒有自己的禁用屬性),但仍然可以修改文本框的值。 Firefox會忽略標記並正常顯示文本框。

public class TextBox : System.Web.UI.WebControls.TextBox, IDisabled 
{ 

    public System.Nullable<bool> Disabled 
    { 
     get { return (System.Nullable<bool>)ViewState["Disabled"]; } 
     set { ViewState["Disabled"] = value; } 
    } 

    public override bool Enabled 
    { 
     get 
     { 
      if (this.Disabled.HasValue) 
      { 
       return !this.Disabled.Value; 
      } 
      else 
      { 
       return true; 
      } 
     } 
     set { this.Disabled = !value; } 
    } 

    protected override void AddAttributesToRender(System.Web.UI.HtmlTextWriter writer) 
    { 
     base.AddAttributesToRender(writer); 

     if (Utilities.RenderDisabled(this)) 
     { 
      writer.AddAttribute(System.Web.UI.HtmlTextWriterAttribute.Disabled, "disabled"); 
     } 
    } 

} 

public class Panel : System.Web.UI.WebControls.Panel, IDisabled 
{ 

    public System.Nullable<bool> Disabled 
    { 
     get { return (System.Nullable<bool>)ViewState["Disabled"]; } 
     set { ViewState["Disabled"] = value; } 
    } 

    public override bool Enabled 
    { 
     get { return true; } 
     set { this.Disabled = !value; } 
    } 

} 

public interface IDisabled 
{ 
    System.Nullable<bool> Disabled { get; set; } 
    bool Enabled { get; set; } 
} 

public sealed class Utilities 
{ 
    public static bool RenderDisabled(IDisabled control) 
    { 
     return (control.Disabled.HasValue && control.Disabled.Value) || (!control.Disabled.HasValue && IsParentDisabled(control)); 
    } 

    public static bool IsParentDisabled(IDisabled control) 
    { 
     System.Web.UI.Control current = ((System.Web.UI.Control)control).Parent; 
     IDisabled currentDisabled = default(IDisabled); 
     while (current != null) 
     { 
      currentDisabled = current as IDisabled; 
      if (currentDisabled != null && currentDisabled.Disabled.HasValue) 
      { 
       return currentDisabled.Disabled.Value; 
      } 
      current = current.Parent; 
     } 

     return false; 
    } 
}