![](/img/trans.png)
[英]How to manage dynamically added asp.net controls with Control.AddAt in c# when during user navigation a Control could be disabled
[英]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.