3

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

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

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

在此处输入图像描述

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

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

谢谢!

4

4 回答 4

4

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

在代码隐藏中:

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 中,扫描所有具有该 className 的树视图节点并禁用与它们关联的复选框:

    // 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];
}
于 2013-02-26T00:51:57.340 回答
1

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

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

即用textSpan.ClassName替换textSpan.firstChild.ClassName

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

<span></span> 

在他们中。你得到一个空引用

if (textSpan.firstChild) 

并且不处理后续节点。

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

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

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

于 2016-09-05T09:59:27.427 回答
0

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

演练:根据安全角色过滤站点地图节点

ASP.NET 站点地图安全修整

于 2013-02-25T23:38:17.017 回答
0

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

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

<script type="text/javascript">
    $(document).ready(function () {
        $("input:checkbox").each(function () {
            $(this).prop('disabled', true);
        });
    });
</script>
于 2019-08-14T13:23:08.400 回答