.Visible プロパティを True または False に設定する必要があるカスタム UserControl があります。ただし、UserControl の最初の子コントロールが Panel で、その ID が cMain の場合、UserControl の代わりに Panel の .Visible プロパティを設定する必要があります。これが私のコードです:
私が使用するカスタムクラスは次のとおりです。
Public MustInherit Class MyControl : Inherits UserControl
Public Overrides Property Visible As Boolean
Get
Return GetVisible()
End Get
Set(value As Boolean)
SetVisible(value)
End Set
End Property
Function GetVisible() As Boolean
Dim c As Control = GetMain()
If TypeOf c Is Panel Then
Return c.Visible
Else
Return MyBase.Visible
End If
End Function
Sub SetVisible(Value As Boolean)
Dim c As Control = GetMain()
If TypeOf c Is Panel Then
c.Visible = Value
Else
MyBase.Visible = Value
End If
End Sub
Function GetMain() As Control
Dim c As Control = If(Controls.Count = 0, Nothing, Controls(0))
If Not (TypeOf c Is Panel AndAlso c.ID = "cMain") Then c = Me
Return c
End Function
End Class
実際の UserControl 自体は次のとおりです。
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="TestControl.ascx.vb" Inherits="JsonJqueryDevex.TestControl1" %>
<asp:Panel ID="cMain" runat="server">
inside
</asp:Panel>
outside
UserControl の分離コード:
Public Class TestControl1
Inherits MyControl
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class
これをホスト ページに実装するためのマークアップは次のとおりです。
<uc:TestControl ID="ucTest" Visible="true" runat="server"></uc:TestControl>
基本クラス内で .Visible をオーバーライドしていることに注意してください。これを行ったのは、参照されているコントロールが UserControl 自体である場合に MyBase を呼び出せるようにするためです。それ以外の場合は、Panel コントロールだと思います。ページをロードすると、System.StackOverflowException
. 面白いのはfalse
、マークアップでカスタム コントロールの Visible プロパティを設定しているときに、これが得られないことです。
スタック トレースは、.Visible の呼び出し時に .Visible の get アクセサーに引っかかっていることを示していますReturn GetVisible()
。Panel の場合は、 が実行されReturn c.Visible
ます。ただし、c が Panel のときに .Visible を参照するとすぐに、MyControl の .Visible get アクセサーに戻ります。カスタム コントロールの Visible プロパティをオーバーライドしているだけなので、これがどのように可能かはわかりませんが、Panel の .Visible プロパティをオーバーライドしているかのように動作しています。ここで何が起こっているのですか?