gpt4 book ai didi

ASP.NEt WebForms UserControl : Why is overriding . 可见导致 System.StackOverflowException?

转载 作者:行者123 更新时间:2023-12-04 05:31:49 26 4
gpt4 key购买 nike

我有一个自定义 UserControl,我需要将其 .Visible 属性设置为 True 或 False。但是,如果 UserControl 的第一个子控件是 Panel 并且它的 ID 是 cMain,我希望它设置 Panel 的 .Visible 属性而不是 UserControl 的。这是我的代码:

这是我使用的自定义类:

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。否则,我假设它是面板控件。当我加载页面时,我得到 System.StackOverflowException .有趣的是,当我将自定义控件的 Visible 属性设置为 false 时,我没有得到这个。在标记中。

堆栈跟踪显示它在调用 Return GetVisible() 时被 .Visible 的 get 访问器捕获。 .如果是面板,则执行 Return c.Visible .但是,一旦我在 c 是面板时引用 .Visible,它就会返回 MyControl 的 .Visible get 访问器。我不知道这是怎么可能的,因为我只是覆盖了我的自定义控件的 Visible 属性,但它的行为就像我覆盖了面板的 .Visible 属性一样。这是怎么回事?

最佳答案

您的问题在于 Control.Visible 的行为.

当值为 false 时,您的程序正在运行因为它只是返回 false在它被检查的时候。但是,控件不会返回 true.Visible 除非 两个控件都可见 并且父级可见 .

在您的情况下发生的情况是,当 true ,父控件正在检查子控件的 .Visible值,并且任何子控件除了自己的 .Visible 之外,还将检查其父控件(您的用户控件)。值(value)。这是无限递归循环发生的地方,导致堆栈溢出。

关于ASP.NEt WebForms UserControl : Why is overriding . 可见导致 System.StackOverflowException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481317/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com