簡體   English   中英

ASP.NET 3.5:禁用父控件時如何防止子控件被禁用?

[英]ASP.NET 3.5: How to keep child controls from beind disabled when parent control is disabled?

以這個簡單的例子為例:

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

現在,在代碼隱藏中,執行以下操作:

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

為什么禁用面板也會禁用其中的文本框? 此外,為什么顯式啟用文本框沒有效果?

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

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

這是設計使然,為了達到您正在尋找的效果,您需要使用不同的方法。 我建議遞歸地遍歷子控件並使用一些邏輯來確定哪些控件被禁用,哪些不被禁用。

您可以使用 javascript 在客戶端執行此操作。

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

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

這是因為控件有一個稱為 IsEnabled 的附加內部屬性,如果控件或父樹中的任何控件的 Enabled 設置為 False,則該屬性返回為 False。 在呈現期間,如果此 IsEnabled 屬性為 False,則 TextBox 添加 disabled 屬性。

您可以通過從 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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM