【问题标题】:Disabling ASP.net treeview checkboxes禁用 ASP.net 树视图复选框
【发布时间】:2013-02-11 06:37:15
【问题描述】:

你们如何有条件地禁用 asp 树视图中的复选框?

例如,如果应用程序用户没有特定权限,请在权限树视图中禁用该权限条目复选框。

这就是我要找的,这是 winform 应用程序中的等价物(复选框被禁用,文本变灰):

我看到了其他解决方案,其中复选框上的单击事件被拦截并忽略。我更喜欢将复选框设置为禁用的解决方案。

我正在寻找 C# 解决方案,但对 C#/Javascript 解决方案感到满意。

谢谢!

【问题讨论】:

    标签: c# javascript asp.net checkbox treeview


    【解决方案1】:

    OP 正在寻找有条件的禁用,但我只想使用 TreeView 来显示历史审计数据,以及何时打开项目的日志。 我页面上的所有复选框都应该被禁用。我花了一些时间才找到这个优雅的 jQuery 解决方案。我希望它可以帮助任何有类似问题的人。

    将下面的代码添加到您的脚本部分。由于所有输入框都将被禁用,因此无需对代码隐藏进行任何更改。

    <script type="text/javascript">
        $(document).ready(function () {
            $("input:checkbox").each(function () {
                $(this).prop('disabled', true);
            });
        });
    </script>
    

    【讨论】:

      【解决方案2】:

      遗憾的是,我没有足够的声誉来直接评论 zukanta 的答案,这有点痛苦,但我必须在 javascript 中进行修改才能使这项工作:

      if (textSpan.firstChild)
                      if (textSpan.className == "disabledTreeviewNode")
                          childCheckBoxes[i].disabled = true;
      

      即将 textSpan.firstChild.ClassName 替换为 textSpan.ClassName

      还值得指出的是,除非您正在处理的树视图中的所有树节点都有一个

      <span></span> 
      

      在其中。您在

      处获得空引用
      if (textSpan.firstChild) 
      

      并且没有后续节点被处理。

      我通过将 class=enabledTreeviewNode 的跨度添加到我不想禁用的所有树节点来解决这一点。

      我猜你也可以在 JavaScript 中处理异常。

      希望这对以后偶然发现这个(否则很好)解决方案的人有所帮助。

      【讨论】:

        【解决方案3】:

        好的,找到了一个相当干净的解决方案:

        在代码隐藏中:

        TreeNode newNode = new TreeNode(permission.ToString());
        newNode.SelectAction = TreeNodeSelectAction.None; // no Link
        
            if (shouldDisableCheckbox)
            {
                // Set a class so disabled nodes can be formatted thru CSS
                // and be identifiable as disabled in Javascript.
                newNode.Text = "<span class=disabledTreeviewNode>" + newNode.Text +"</span>";
            }
        
        nodes.Add (newNode);
        

        在 Javascript 中,扫描所有具有该类名的树视图节点并禁用与它们关联的复选框:

            // Called via a startup script created in Code Behind.
            // Disables all treeview checkboxes that have a text with a class=disabledTreeviewNode.
            // treeviewID is the ClientID of the treeView
            function DisableCheckBoxes(treeviewID)
            {
                TREEVIEW_ID = treeviewID;
        
                var treeView = document.getElementById(TREEVIEW_ID);
        
                if (treeView)
                {
                    var childCheckBoxes = treeView.getElementsByTagName("input");
                    for (var i = 0; i < childCheckBoxes.length; i++)
                    {
                        var textSpan = GetCheckBoxTextSpan(childCheckBoxes[i]);
        
                        if (textSpan.firstChild)
                            if (textSpan.firstChild.className == "disabledTreeviewNode")
                                childCheckBoxes[i].disabled = true;
                    }
                }
            }
        
        function GetCheckBoxTextSpan(checkBox)
        {
            // Set label text to node name
            var parentDiv = checkBox.parentNode;
            var nodeSpan = parentDiv.getElementsByTagName("span");
        
            return nodeSpan[0];
        }
        

        【讨论】:

        • 这很好用,但我遇到了一个非常奇怪的问题。我的树视图在回发时没有改变,但我必须运行这个 JS 2x 才能应用它,除非我将你的 if (textSpan.firstChild.className == "disabledTreeviewNode") 行更改为 if (textSpan.className == "disabledTreeviewNode" || textSpan.firstChild.className == "disabledTreeviewNode") 在第一次通话中,textSpan.className == "disabledTreeviewNode"true,随后调用你textSpan.firstChild.className == "disabledTreeviewNode" 的代码作品。不是 100% 确定我理解,但检查这两个条件使这项工作。
        • 作为后续,看看我发的这篇文章,它在jQuery 的大约 3 行中完成了所有这些 JavaScriptstackoverflow.com/questions/18858842/…
        • 如果您正在使用 UpdatePanel,请将 DisableCheckBoxes 函数绑定到 $(document).ready jQuery 事件和回发结束事件,并摆脱那些讨厌的服务器端代码。
        【解决方案4】:

        您可以使用安全调整来不显示用户无权访问的项目。我不知道有什么方法可以显示项目但不活动。在客户端禁用复选框只会造成安全漏洞。

        Walkthrough: Filtering Site-Map Nodes Based on Security Roles

        ASP.NET Site-Map Security Trimming

        【讨论】:

        • 感谢 DaveB,但权限树视图只是一个示例。我只是想在某些条件下在 asp.net 树视图中将一些复选框设置为“禁用”。我还需要显示那些树视图节点,但只需将它们设置为禁用。所以安全修剪似乎是一个牵强的解决方案,但还是谢谢。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-24
        • 2014-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多