从子用户控制页面设置父页面控制可见性

Posted

技术标签:

【中文标题】从子用户控制页面设置父页面控制可见性【英文标题】:Setting parent page controls visibility from Child user control page 【发布时间】:2012-07-22 19:20:59 【问题描述】:

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

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

即使在快速观看 Page1.button1 的可见性在分配行设置为 false,当我看到 UI 时,它仍然可见。我不知道我做错了什么。或者我获取 button1 的方式及其可见性不正确。

一般来说,我们可以在用户控件事件期间从用户控件设置父页面的控件属性吗?

【问题讨论】:

你的问题有点混乱。您确定您的意思是 IsButton1Visible 属性是用户控件的一部分吗? 在您的用户控件中引发您的页面可以处理的自定义事件。然后您可以根据事件参数或 UserControl 属性在此处切换可见性。 更好的方法可能是在您的控件上设置一个事件以达到UpdateParentButtonVisibility 的效果,并创建一个事件参数来设置所需的可见性。然后,您的父页面可以订阅该事件并进行适当的处​​理。 @freefaller 是的。 IsButton1Visible 用户控件的属性。我的想法是在 uc1.Grid1 Row Command 事件期间在用户控件 uc1 中设置 IsButton1Visible(bool) 属性,然后在 Page1.prerender 事件中从 Page1 访问该属性并设置 Page1.button1.Visibile = uc1.IsButton1Visible .但是设置 Page1.button1 的可见性没有效果。我想我误解了更新面板的工作方式。即使我设置了属性, Page1 也根本没有刷新。我的解释清楚吗? @SARAVAN 可以肯定地说您的按钮位于更新面板之外吗? 【参考方案1】:

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

委托/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;
    

【讨论】:

感谢您的回答。只是想知道,如果在用户控件的更新面板内的网格控件中发生事件,这是否有效 如果网格位于更新面板中并且要更新的按钮位于更新面板之外,则此答案将不起作用。我提供了另一个适用于这种情况的答案。 这个答案让我想到了更新面板的工作原理。我正在使用上面答案中建议的想法。感谢您的帮助。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

例如

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

【讨论】:

以上是关于从子用户控制页面设置父页面控制可见性的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 DataTemplates 设置控制的可见性

网页制作:HTML5 标准提供了哪些新的 API

如何从子视图控制器访问父视图控制器的视图?

RBAC简介

JWT的权限控制与Shiro入门

控制子表单记录和选项卡控制页面?