mina morsali
mina morsali

Reputation: 778

user control change property and use in usercontrol's code behind

I have an aspx page that inherit from one master page and have two content place holder, like this:

   <%@ 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>

for some javascript reason I can not put my "cphPage" Content into update panel, and I need to show/unshow cphPage's usercontrols base on link clicked in cphMenu. for doing this I add panel into usercontrol's update panel and want to visible or unvisible this panels when post back occur , so I Define a property in each user control (in cphPage content place holder):

[Bindable(true, BindingDirection.TwoWay)]
    public bool ContentVisible
    {
        get { return Convert.ToBoolean(Session["ContentVisible"]); }
        set { Session["ContentVisible"] = value; }
    }

and in aspx code behind change value base one clicked link:

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;
    }
}

and in user controls I check this value to visible/ unvisible usercontrol's panels:

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

but this code won't work , because user controls initiate before execution of aspx code behind... how can I do this scenario? what other solutions exist for this?

thank you

Upvotes: 0

Views: 1024

Answers (1)

PrzemG
PrzemG

Reputation: 795

You have two options:

Change ContentVisible property to:

[Bindable(true, BindingDirection.TwoWay)]
public bool ContentVisible
{
    set 
    {  
        pnlCalendar.Visible = value;
        pnlDefaultEvents.Visible = value;
        pnlAddEvent.Visible = value;
     }
}

or move that code:

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

Into event in user control that occurs later in life cycle than uExpander_ExpanderClicked event from parent page. OnPreRender should be late enought but not too late to do hide/show panels.

Upvotes: 1

Related Questions