从子用户控制页面设置父页面控制可见性
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;
【讨论】:
以上是关于从子用户控制页面设置父页面控制可见性的主要内容,如果未能解决你的问题,请参考以下文章