Это связано с тем, что у элементов управления есть дополнительное внутреннее свойство IsEnabled, которое возвращается как False, если для элемента управления или любого из элементов управления в родительском дереве значение Enabled установлено на False.Во время рендеринга TextBox добавляет атрибут disabled, если это свойство IsEnabled имеет значение False.
Вы можете создавать свои собственные пользовательские элементы управления, наследуя их от элементов управления Panel и TextBox, и добавлять свои собственные свойства и логику.Что-то вроде того, что у меня ниже, должно работать.
Кроме того, я бы не рекомендовал отображать отключенный атрибут на панели, который отображается как div.Атрибут disabled не является стандартным атрибутом html для div, и браузеры отображают содержимое непоследовательно.Например, 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;
}
}