为什么我的 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
.我已经尝试挂钩到 Load
、PreRender
和 Init
事件,并且 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
我有一个问题,我的用户控件上的可见 属性 总是返回 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
.我已经尝试挂钩到 Load
、PreRender
和 Init
事件,并且 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