【问题标题】:Selectively disabling WebControl elements有选择地禁用 Web 控制元素
【发布时间】:2011-01-07 16:42:30
【问题描述】:

我有一个带有 PlaceHolder 元素的 ASP.Net MasterPage。 PlaceHolder 的内容可以通过两种模式查看:读写和只读。

为了实现只读,我想禁用 PlaceHolder 中的所有输入。
我决定通过递归循环遍历 PlaceHolder 的控件集合,找到所有从 WebControl 继承的控件集合,并设置 control.Enabled = false;

这是我最初写的:

private void DisableControls(Control c)
{
    if (c.GetType().IsSubclassOf(typeof(WebControl)))
    {
        WebControl wc = c as WebControl;
        wc.Enabled = false;
    }

    //Also disable all child controls.
    foreach (Control child in c.Controls)
    {
        DisableControls(child);
    }
}

这工作正常,并且所有控件都被禁用...但是要求发生了变化;)
现在,我们要禁用所有具有特定 CssClass 的控件除了

所以,我第一次尝试新版本:

private void DisableControls(Control c)
{
    if (c.GetType().IsSubclassOf(typeof(WebControl)))
    {
        WebControl wc = c as WebControl;
        if (!wc.CssClass.ToLower().Contains("someclass"))
            wc.Enabled = false;
    }

    //Also disable all child controls.
    foreach (Control child in c.Controls)
    {
        DisableControls(child);
    }
}

现在我遇到了一个问题。如果我有(例如)一个包含<ASP:DropDownList><ASP:Panel>,并且我想保持启用 DropDownList,那么这不起作用。

我在面板上调用 DisableControls,它被禁用。然后它循环遍历子项,并在 DropDownList 上调用 DisableControls,并使其保持启用状态(如预期的那样)。但是,由于 Panel 被禁用,当页面呈现时,<div> 标签内的所有内容都被禁用!

你能想办法解决这个问题吗?我曾考虑将c.GetType().IsSubclassOf(typeof(WebControl)) 更改为c.GetType().IsSubclassOf(typeof(SomeParentClassThatAllInputElementsInheritFrom)),但找不到合适的!

【问题讨论】:

    标签: asp.net web-controls


    【解决方案1】:

    您只想禁用输入控件,因此您的代码过于笼统。做这样的事情:

    if (IsInputControl(wc) && !wc.CssClass.ToLower().Contains("someclass"))
                wc.Enabled = false;
    

    并创建函数 IsInputControl:

    bool isInputControl(WebControl ctl) {
        if (ctl is TextBox ||
          ctl is DropDownList || 
          ctl is CheckBox ||
          ...) {
          return true;
        } else {
          return false;
        }
    }
    

    虽然我不知道 WebControl 的任何通用属性将其标识为输入控件,但类型并不多,因此这样做应该没什么大不了的。

    【讨论】:

    • 是的,我想过做这样的事情......我担心的是让该类型列表正确/完整。如果我能找到一种更通用的方法来发现“输入”元素,那么我会去做。如果没有,那么我会将您的答案标记为:)
    • 我以前做过这样的事情,我从来没有找到过,并不是说它不存在。我这样做是为了一个更通用的表单控制器,我最终创建了控件类别(InputControls、Validators、InputControls_WithHiddenFields)。我不认为隐藏字段对您的情况很重要,但它们对我的情况很重要,而且它们不是 WebControls(尽管位于 System.Web.UI.WebControls 命名空间中),这使得它更加丑陋。
    • 我最终做了与你建议相反的事情。我写了一个“IsContainerControl”函数......可能的容器列表似乎比可能的输入控件列表短!目前,我只排除了面板控件,但我预计随着更多的识别,该列表会增加。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多