Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何禁用ASP:面板但不禁用选择性子控件?_Asp.net_Webforms - Fatal编程技术网

Asp.net 如何禁用ASP:面板但不禁用选择性子控件?

Asp.net 如何禁用ASP:面板但不禁用选择性子控件?,asp.net,webforms,Asp.net,Webforms,我在根目录上有一个asp:面板,里面有很多控件。 当我禁用面板时,所有子级都将被解散(panel.Enabled=false) 但我希望其中一些,例如超链接,即使容器被禁用,也保持启用状态 如果我不能用一种更聪明的方式来做这件事,我将不得不把我的面板分解成许多块来让它工作 编辑: 实际上,我正在做的是一个“只读”版本的页面和一个“可更新”版本的表单。如果你不想分解面板,那么你可以循环它的子控件(如果没有太多)。伪代码: foreach(var c in panel.controls) {

我在根目录上有一个asp:面板,里面有很多控件。 当我禁用面板时,所有子级都将被解散(panel.Enabled=false)

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

如果我不能用一种更聪明的方式来做这件事,我将不得不把我的面板分解成许多块来让它工作


编辑:


实际上,我正在做的是一个“只读”版本的页面和一个“可更新”版本的表单。

如果你不想分解面板,那么你可以循环它的子控件(如果没有太多)。伪代码:

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

如果要禁用大多数控件,请执行以下操作

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

很难理解你到底想要实现什么。以上的答案对我来说似乎完全合理。不过我有一种感觉,您希望只启用一些特定的控件,这些控件可能是一些特定的按钮和一些特定的超链接。对吗

为什么不考虑某种方法,声明不想禁用的控件(例如,带有它们的id)??您可以通过声明一个字符串列表来实现这一点,该字符串表示不应在页面/usercontrol中禁用的控件id,如

string[] controlIdsToKeepEnabled = new string[]{"buttonSubmit", "hyperlinkInfo"}
然后在递归禁用站点所有控件的方法中,检查控件是否不在“ControlIDstokeAppEnabled”列表中


有点复杂,但可以在你的特殊情况下使用。然后,此功能可以很好地打包到一个单独的自定义服务器控件中。

尝试了所有解决方案,但不起作用,然后才从基础开始并实现。请参见下面的答案,这可能会对您有所帮助

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不能作为webcontrol访问)并且cntrols enable属性仅可用于web和html控件

当然我以前做过,但这是一个混乱,因为我的所有控件都有不同的状态,由另一个模块控制。我必须编程启用/禁用所有按钮,除了少数按钮。i、 我能有一个“c.Enabled=a | | B;”其中a是从B中抽象出来的吗?此外,A和B可以通过任何事件进行更改。您可以传递一个
params control[]keepanabled
参数,然后执行
foreach(keepanabled中的网络控制c)c.Enabled=true