为什么我的 UserControl Visible 属性 总是返回 false?

Why is my UserControl Visible property always returning false?

我有一个问题,我的用户控件上的可见 属性 总是返回 False,不管它是否应该在页面上可见。我有以下用户控件:

<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="WebUserControl1.ascx.vb" Inherits="VB_WebApp_Test.WebUserControl1" %>
<h1>My User Control</h1>
Public Class WebUserControl1
    Inherits UserControl

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.PreRender
        If Visible Then
            Console.WriteLine("VISIBLE")
        End If
    End Sub

End Class

我加载到以下页面:

<%@ Page Title="Home Page" Language="VB" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Default.aspx.vb" Inherits="VB_WebApp_Test.Default" %>
<%@ Register src="WebUserControl1.ascx" tagName="WebUserControl" tagPrefix="Mine"%>

<asp:Content ID="BodyContent" ContentPlaceHolderID="MainContent" runat="server">
    <asp:UpdatePanel runat="server">
        <ContentTemplate>
            <table>
                <tr>
                    <td>
                        <asp:MultiView runat="server" ID="multiView">
                            <asp:View ID="vInit" runat="server">
                                <h1>Initial View</h1>
                                <asp:Button runat="server" ID="toControlButton" Text="To Control"/>
                            </asp:View>
                            <asp:View ID="vControl" runat="server">
                                <Mine:WebUserControl ID="wuc1" runat="server"/>
                                <asp:Button runat="server" ID="toNonControlButton" Text="To Non Control"/>
                            </asp:View>
                        </asp:MultiView>
                    </td>
                </tr>
            </table>
        </ContentTemplate>
    </asp:UpdatePanel>
</asp:Content>
Public Class [Default]
    Inherits Page

    Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
        multiView.ActiveViewIndex = 0
    End Sub

    Public Sub ToControl(sender As Object, e As EventArgs) Handles toControlButton.Click
        multiView.ActiveViewIndex = 1
    End Sub

    Public Sub ToNonControl(sender As Object, e As EventArgs) Handles toNonControlButton.Click
        multiView.ActiveViewIndex = 0
    End Sub

End Class

我想做的是让我可以在显示用户控件时做一些初始化逻辑,但是 Visible 属性 总是设置为 False.我已经尝试挂钩到 LoadPreRenderInit 事件,并且 Visible 属性 对所有事件都是 False

当你的ActiveViewIndex在按钮的Click事件中更新时,事件顺序为:

1)加载页面,ActiveIndex为0,UC不可见

2)加载UserControl,UC因View不可见

3) 处理事件,ActiveIndex 更新为 1,所有相关控件的 Visibility 属性 更新

4) Page.LoadComplete 事件(Visible 已经是 True,但你没有事件)

5) Page.PreRender (Visible 已经是 True,但你还没有事件)

6) UC.PreRender - 在这里你应该看到 Visible=True.

我刚刚在空项目上测试了这个并且它有效。您在检查 PreRender 事件时一定错过了一些东西。

基于可见性的初始化不是很好的做法。我建议你像这样添加一些初始化:

Public Sub Init()
    'Do init here
End Sub