【问题标题】:ASP.NET 3.5: How to keep child controls from beind disabled when parent control is disabled?ASP.NET 3.5:禁用父控件时如何防止子控件被禁用?
【发布时间】:2023-04-03 10:25:01
【问题描述】:

以这个简单的例子为例:

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

现在,在代码隐藏中,执行以下操作:

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

为什么禁用面板也会禁用其中的文本框?此外,为什么显式启用文本框没有效果?

这显然与 ASP.NET 框架有关。有什么办法可以避免这种情况吗?

注意:这不是我在应用程序中使用的实际代码。这只是一个示例,展示了禁用控件如何同时递归禁用其中的所有子控件。

【问题讨论】:

  • 显然,如果您禁用面板,其中的所有内容都将被禁用 - 这是设计使然。
  • 您的标题说如何使用面板禁用控件,但在问题中它说您需要使用禁用的面板启用控件
  • IrishChieftain - 是的,我知道它必须与框架相关,因此我的问题是“有什么办法可以避免这种情况吗?”。 Jayantha - 对。控件会自动被禁用,所以我上面的代码示例说明了我是如何在事后强制启用它们的。
  • 我认为如果您描述了 UI 及其作用,将会有所帮助。那么我们也许可以为您提供替代方案。通常,我在设计 UI 时会尽量避免陷入这些情况:)

标签: asp.net controls


【解决方案1】:

这是设计使然,要达到您正在寻找的效果,您需要使用不同的方法。我建议递归地遍历子控件并使用一些逻辑来确定哪些控件被禁用,哪些没有。

【讨论】:

    【解决方案2】:

    您可以使用 javascript 在客户端执行此操作。

    var controls = document.getElementById("<%=pnlTest.ClientID%>").getElementsByTagName("input");
    
    for (var i = 0; i < controls.length; i++)
        controls[i].disabled = true; 
    

    【讨论】:

    • 记住,我给出的例子只是一个简单的例子。我们实际应用程序中的控件层次结构包含许多不同类型的控件。此外,某些控件必须保持禁用状态,因此我们不能对每个子控件进行无条件的蛮力启用。我能看到让它工作的唯一方法是递归地获取所有启用的子控件的集合,然后在事后在客户端上重新启用它们,但我希望不必求助于这种只是理论上的黑客此时。
    【解决方案3】:

    这是因为控件有一个称为 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      • 2012-01-01
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多