2

.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 プロパティをオーバーライドしているかのように動作しています。ここで何が起こっているのですか?

4

1 に答える 1

3

あなたの問題は の動作にありControl.Visibleます。

値がチェックされた時点で値がfalse返されるだけなので、プログラムは機能しています。ただし、コントロールが表示され、親が表示されない限りfalse、コントロールは返さtrueれません。.Visible

あなたの場合true、親は子コントロールの.Visible値をチェックしており、子コントロールはそれ自身の値に加えて親 (ユーザー コントロール) をチェックし.Visibleます。ここで無限再帰ループが発生し、スタック オーバーフローが発生します。

于 2012-09-19T01:34:39.947 に答える