2012-07-24 44 views
0

我有一个拥有button1的父页面Page1。 Page1有一个usercontrol uc1。 uc1有一个更新面板,里面有一个网格grid1。我试图将Page1.button1的可见性设置为false,具体取决于uc1.grid1的行命令事件(在行命令事件中有一些条件)。我以下面的方式设置Page1.button1的可见性:设置父页面控制子项用户控件页面的可见性

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

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

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

+0

你的问题是有点混乱。你确定你的意思是'IsButton1Visible'属性是usercontrol的一部分吗? – freefaller 2012-07-24 13:10:14

+1

在您的UserControl中引发您的页面可以处理的自定义事件。然后,您可以根据事件参数或UserControl属性切换可见性。 – 2012-07-24 13:10:58

+0

更好的方法可能是在控件上添加一个UpdateParentButtonVisibility效果的事件,并创建一个事件arg来设置所需的可见性。您的父母页面然后可以订阅该事件并进行适当的处​​理。 – 2012-07-24 13:11:26

回答

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

感谢您的回答。只是想知道,如果这可以在用户控件的更新面板内的网格控件中发生事件时起作用 – SARAVAN 2012-07-24 13:32:01

+0

如果网格位于更新面板中并且要更新的按钮不在更新面板。我已经提供了另一个可以在这种情况下工作的答案。 – 2012-07-24 13:38:17

+0

这个答案让我想起更新面板的工作原理。我正在使用上面的答案中提出的想法。感谢您的帮助。 – SARAVAN 2012-08-03 06:23:15

0

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

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); 
} 
相关问题