2009-09-18 15 views
1

我有一个asp:面板上的根和很多控件里面。 当我禁用面板时,所有的孩子都是disbled(Panel.Enabled = false)。如何禁用ASP:面板但除了选择性子控件?

但我想要其中的一些,例如超链接,即使容器被禁用也保持启用状态。

如果我不能以更聪明的方式做到这一点,我将不得不将我的面板分解成许多部分以使其工作。


编辑:

其实我在做什么是页面和形式的“UPDATE-ABLE”版的“只读”版本。

回答

2

如果要禁用最需要的控件像

DisableAllChildControls(panel); // disabled all controls within panel 
//then enable those you want to keep enabled 
HyperlinkControl1InPanel.Enabled=true; 
HyperlinkControl2InPanel.Enabled=true; 
... 

void DisableAllChildControls(WebControl p) 
{ 
    foreach (WebControl c in p.Controls) 
    { 
     c.Enabled=false; 
     DisableAllChildControls(c); //recurse 
    } 
} 

,或者如果你只是想所有超链接启用

void DisableAllControlsButHyperlinks(WebControl p) 
{ 
    foreach (WebControl c in p.Controls) 
    { 
     c.Enabled=(c is HyperLink); 
     DisableAllControlsButHyperlinks(c); //recurse 
    } 
} 
+0

当然,我以前做过,但这是一个烂摊子,因为我所有的控制有不同的状态,这是由另一个模块控制。 我必须编程启用/禁用所有这些,除了几个按钮。即我可以有一个“c.Enabled = A || B;” A是从B抽象出来的?另外,A和B可以在任何事件中改变。 – 2009-09-18 16:21:36

+0

你可以传递'params control [] keepEnabled'参数,然后执行'foreach(webControl c in keepEnabled)c.Enabled = true;' – wefwfwefwe 2009-09-21 09:10:55

0

好吧,如果你不想打破面板,那么你可以循环其子控件(如果没有太多)。伪代码:

foreach(var c in panel.controls) 
{ 
    if(c is not a hyperlink) c.Enabled=false; 
} 
1

很难理解什么正是你想达到的。上面的答案对我来说似乎是完全合理的。我有这种感觉,你想保持启用只是一些特定的控件,可能是一些特定的按钮和一些特定的超链接。那是对的吗??

为什么不考虑一些你不想禁用的控件(例如它们的id)的方法?你可以做到这一点通过声明表示不应该在你的页面/用户控件被禁用像

string[] controlIdsToKeepEnabled = new string[]{"buttonSubmit", "hyperlinkInfo"} 

控件的ID的字符串列表则在该方法,你递归禁用所有网站的您检查是否控制该控件不在列表“controlIdsToKeepEnabled”中。

有点复杂,但可以适用于您的特殊情况。这个功能可以很好地包装在一个单独的自定义服务器控件中。

2

尝试了所有的决议,但它没有工作刚刚开始使用的基础知识和achived它,请参见下面的答案,可以帮助你

foreach (Control c in Panel1.Controls) 
{ 
    if (c is WebControl) 
    { 
     WebControl wc = (WebControl)c; 
     if (c.ID.Equals("ControlID")) 
     { 
      wc.Enabled = true; 
     } 
     else 
     { 
      wc.Enabled = false; 
     } 
    } 

} 

立即数控制?(喜欢的ContentPlaceHolder不能为三夏被访问)和控制启用财产是可用于网络和HTML控件只