2011-08-11 3 views
1

예를 들어이 간단한 예제를 보자ASP.NET 3.5 : 부모 컨트롤을 사용할 수 없으면 자식 컨트롤을 사용하지 않도록 설정하는 방법?

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

이유도 패널이 그 안에 텍스트 상자를 사용하지 않도록 사용하지 않습니다

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

, 숨김,이 있습니까? 또한 텍스트 상자를 명시 적으로 활성화해도 아무 효과가없는 이유는 무엇입니까?

이것은 분명히 ASP.NET 프레임 워크와 관련이 있습니다. 내가 이것을 피할 수있는 방법이 있습니까?

참고 : 이것은 실제 응용 프로그램에서 사용하는 코드가 아닙니다. 이것은 컨트롤을 사용 불가능으로 설정하면 컨트롤 내의 모든 자식 컨트롤을 재귀 적으로 비활성화하는 방법을 보여주는 예일뿐입니다.

+0

분명히 패널을 사용하지 않으면 패널의 모든 항목이 비활성화됩니다. 이는 의도적으로 설계된 것입니다. – IrishChieftain

+0

당신의 제목은 패널을 사용하여 컨트롤을 비활성화하는 방법을 말합니다. 그러나 비활성화 된 패널을 사용하여 컨트롤을 활성화해야한다고하는 질문에 –

+0

IrishChieftain - 맞습니다. 프레임 워크와 관련되어야한다는 것을 알고 있었기 때문에 " 이것을 피할 수 있습니까? " 자얌 타 - 맞아. 컨트롤은 자동으로 비활성화되므로 위에 나와있는 코드 예제에서는 사실 이후에 어떻게 강제로 활성화하려고하는지 보여줍니다. – oscilatingcretin

답변

1

이것은 의도적으로 설계된 것으로, 사용자가 찾고있는 효과를 얻기 위해 다른 접근 방법을 사용해야합니다. 재귀 적으로 자식 컨트롤을 반복하고 어떤 컨트롤을 사용하여 어떤 컨트롤이 비활성화되고 어떤 것이 아닌지 결정할 것을 제안합니다.

0

이 작업은 자바 스크립트를 사용하여 클라이언트 측에서 수행 할 수 있습니다.

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는 disabled 특성을 추가합니다.

Panel 및 TextBox 컨트롤에서 상속하여 사용자 지정 컨트롤을 만들고 자신의 속성 및 논리를 추가 할 수 있습니다. 제가 아래에있는 것과 같은 것이 작동해야합니다.

또한 div로 렌더링되는 Panel에서 disabled 속성을 렌더링하는 것을 권장하지 않습니다. 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; 
    } 
} 
관련 문제