设置父页面控制来自子用户控制页面的可见性

时间:2012-07-24 13:03:03

标签: asp.net .net updatepanel parent-child

我有一个父页面Page1,它有button1。 Page1有一个usercontrol uc1。 uc1有一个更新面板,其中有一个网格grid1。我试图将Page1.button1的可见性设置为false,具体取决于uc1.grid1的行命令事件(在row命令事件中有一些if条件)。我通过以下方式设置Page1.button1的可见性:

在uc1中创建一个IsButton1Visible属性。将UC1.Grid1.RowCommand中的属性设置为false,在第1页PreRender事件上,访问IsButton1Visible并设置Page1.button1可见性。

即使在快速监视中,Page1.button1的可见性在赋值行设置为false,但当我看到UI时,它仍然可见。我不知道我做错了什么。或者我抓住button1的方式及其可见性不正确。

通常我们可以在用户控件事件期间从用户控件设置父页面的控件属性吗?

3 个答案:

答案 0 :(得分:1)

如果您使用事件驱动的模型方法

Delegate / EventArgs代码:

public class ButtonVisiblityEventArgs : EventArgs
{
    public ButtonVisiblityEventArgs(bool visible)
    {
        this.Visiblity = visible;
    }

    public bool Visiblity { get; private set; }
}

public delegate void UpdateParentButtonVisibilityEventHandler(object sender, ButtonVisiblityEventArgs args);

用户控制代码:

    public event UpdateParentButtonVisibilityEventHandler RaiseUpdateParentButtonVisibilityEvent;

    private void RequestParentButtonVisibilityChange(bool setVisible)
    {
        if (RaiseUpdateParentButtonVisibilityEvent != null)
        {
            RaiseUpdateParentButtonVisibilityEvent(this, new ButtonVisiblityEventArgs(setVisible));
        }
    }

在命令处理程序中,只需调用:

    RequestParentButtonVisibilityChange(false);

每当您想要隐藏按钮时。在您的页面上:

    protected void Page_Load(object sender, EventArgs e)
    {
        this.RaiseUpdateParentButtonVisibilityEvent += new UpdateParentButtonVisibilityEventHandler(uc_RaiseUpdatecurrentDisplayPanelRequestEvent);
    }

    private void uc_RaiseUpdatecurrentDisplayPanelRequestEvent(object sender, ButtonVisiblityEventArgs args)
    {
        button1.Visible = args.Visiblity;
    }

答案 1 :(得分:0)

如果您遇到的问题是您的按钮位于更新面板之外,则可以执行以下操作。页面代码隐藏:

    protected void Page_Load(object sender, EventArgs e)
    {
        string hideScript = string.Format("function updateButtonVisibility( visibility ) {{ var button = $('#{0}'); if (visibility) {{ button.show(); }} else {{ button.hide(); }} }}", this.button1.ClientID);

        Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "updateButtonVisibility", hideScript, true);

    }

在您的用户控制命令处理程序中:

   bool shouldButtonBeVisible = false; //update this appropriately in your logic
   ScriptManager.RegisterStartupScript(this, this.GetType(), "upUpdateButtonVisibility", "updateButtonVisibility(" + shouldButtonBeVisible ? "true" : "false" + ");", true);

请注意,这会在您的UC和页面之间产生紧密依赖关系。它要求使用此控件的任何页面都已注册此脚本。有办法解决这个问题(例如设置函数脚本回调来调用,检测是否存在javascript函数等),但这至少应该让你感动。

如果更新面板完成之后页面上有特定内容可以关闭,那么注册结束请求处理程序可能会更好

$(function() { Sys.WebForms.PageRequestManager.getInstance().add_endRequest(updatePanelEndRequestHandler); } );

function updatePanelEndRequestHandler() {
   var shouldBeVisible = $('.MyClassThatSaysIShouldntAllowMoreButtons').length > 0; //do some checking on the grid
   updateButtonVisibility(shouldBeVisible);
}

答案 2 :(得分:0)

您可以将用户控件放在父页面的面板内,并更改可见性。

例如

   <asp:Panel runat="server" ID="pnlQuote">
        ...
    </asp:Panel>

    <asp:Panel runat="server" ID="pnlContact">
        <uc1:ContactForm runat="server" ID="ContactForm " />
    </asp:Panel>

从子控件中,您可以创建一个按钮单击事件,该事件可以执行以下操作

 protected void btnBackToQuote_Click(object sender, EventArgs e)
        {
            Panel pnlQuote = this.Parent.FindControl("pnlQuote") as Panel;
            Panel pnlContact = this.Parent.FindControl("pnlContact") as Panel;

            pnlQuote .Visible = true;
            pnlContact.Visible = false;
        }