用户控件更改属性和使用在usercontrol的代码后面
本文关键字:usercontrol 代码 控件 属性 用户 | 更新日期: 2023-09-27 18:12:00
我有一个从一个母版页继承的aspx页面,并有两个内容占位符,像这样:
<%@ Register Src="Controls/YearBook/YearBookExpander.ascx" TagName="YearBookExpander" TagPrefix="uc1" %>
<%@ Register Src="Controls/YearBook/YearBook.ascx" TagName="YearBook" TagPrefix="uc2" %>
<%@ Register Src="Controls/YearBook/YearBookSearch.ascx" TagName="YearBookSearch" TagPrefix="uc3" %>
<asp:Content ID="Content1" ContentPlaceHolderID="cphHead" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="cphMenu" runat="Server">
<asp:UpdatePanel ID="upExpander" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<nav id='main-nav'>
<asp:Panel ID="pnlExpander" runat="server" CssClass="navigation">
<uc1:YearBookExpander ID="ybExpander" runat="server" OnSearchClickEvent="ybExpander_Search" />
</asp:Panel>
</nav>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="cphPage" runat="Server">
<asp:Panel ID="pnlPage" runat="server">
<uc2:YearBook ID="YearBook1" runat="server" ContentVisible="true" />
<uc3:YearBookSearch ID="ybSearch" runat="server" />
</asp:Panel>
</asp:Content>
<asp:Content ID="Content4" ContentPlaceHolderID="cphScripts" runat="Server">
<script src="../Scripts/PersianCalendar.js" type="text/javascript"></script>
<script type="text/javascript">
Calendar = 1;
</script>
</asp:Content>
一些javascript的原因,我不能把我的"cphPage"内容到更新面板,我需要显示/取消显示cphPage的用户控制的基础上链接点击在cphMenu。为此,我将面板添加到usercontrol的更新面板中,并希望在post back发生时显示或不显示此面板,因此我在每个用户控件中定义一个属性(在cphPage内容占位符中):
[Bindable(true, BindingDirection.TwoWay)]
public bool ContentVisible
{
get { return Convert.ToBoolean(Session["ContentVisible"]); }
set { Session["ContentVisible"] = value; }
}
和在aspx代码后面更改值基础一次点击链接:
private void uExpander_ExpanderClicked(object sender, ExpanderEventArgs e)
{
switch (e.Clicked)
{
case "YearBook":
YearBook1.ContentVisible = true;
ybSearch.ContentVisible = false;
break;
case "Search":
ybSearch.ContentVisible = true;
YearBook1.ContentVisible = false;
break;
default:
YearBook1.ContentVisible = true;
ybSearch.ContentVisible = false;
break;
}
}
和在用户控件,我检查这个值可见/不可见的usercontrol的面板:
if (ContentVisible)
{
pnlCalendar.Visible = true;
pnlDefaultEvents.Visible = true;
pnlAddEvent.Visible = true;
}
else
{
pnlCalendar.Visible = false;
pnlDefaultEvents.Visible = false;
pnlAddEvent.Visible = false;
}
但是这段代码不会工作,因为用户控件在执行aspx代码之前启动…我该如何实现这个场景?还有其他的解决方案吗?
thank you
您有两个选择:
修改ContentVisible属性为:
[Bindable(true, BindingDirection.TwoWay)] public bool ContentVisible { set { pnlCalendar.Visible = value; pnlDefaultEvents.Visible = value; pnlAddEvent.Visible = value; } }
或移动代码:
if (ContentVisible)
{ pnlCalendar.Visible = true; pnlDefaultEvents.Visible = true; pnlAddEvent.Visible = true; } else { pnlCalendar.Visible = false; pnlDefaultEvents.Visible = false; pnlAddEvent.Visible = false; }
进入用户控件中的事件,该事件在生命周期中发生的时间晚于父页面的uExpander_ExpanderClicked事件。OnPreRender应该足够晚,但不会太晚,以执行隐藏/显示面板