0

我有一个具有 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 的方式及其可见性不正确。

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

4

3 回答 3

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;
    }
于 2012-07-24T13:17:59.553 回答
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);
}
于 2012-07-24T13:31:37.287 回答
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;
        }
于 2018-09-11T08:55:08.180 回答