【问题标题】:user control change property and use in usercontrol's code behind用户控件更改属性并在用户控件后面的代码中使用
【发布时间】:2014-07-09 06:45:50
【问题描述】:

我有一个 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”内容放入更新面板,我需要根据在 cphMenu 中单击的链接来显示/取消显示 cphPage 的用户控件。 为此,我将面板添加到用户控件的更新面板中,并希望在回发时显示或不显示此面板,因此我在每个用户控件中定义了一个属性(在 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;
    }
}

在用户控件中,我将此值检查到可见/不可见用户控件的面板:

if (ContentVisible)
        {
            pnlCalendar.Visible = true;
            pnlDefaultEvents.Visible = true;
            pnlAddEvent.Visible = true;
        }
        else
        {
            pnlCalendar.Visible = false;
            pnlDefaultEvents.Visible = false;
            pnlAddEvent.Visible = false;
        }

但此代码不起作用,因为用户控件在执行 aspx 代码之前启动... 我该怎么做这个场景?对此还有什么其他解决方案?

谢谢你

【问题讨论】:

    标签: c# asp.net user-controls


    【解决方案1】:

    你有两个选择:

    将 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 应该足够晚,但不能太晚来隐藏/显示面板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2011-02-23
      • 1970-01-01
      相关资源
      最近更新 更多