检查 TreeView 中选中的节点数

2023-12-30

我是使用树视图的新手,我希望能够确保树视图只能检查一个子节点,如果有人尝试检查多个子节点,它会停止检查事件并取消选择所有父节点和子节点。我该怎么做呢?到目前为止,这就是我所得到的,但它表现得很奇怪。有什么建议么?

Update:为了澄清一些事情,这是一个 win 表单树视图,父节点是一个类别,每个类别可以包含多个项目。我只希望用户能够一次选择一个类别并从该类别中选择一项。

private void tvRecipes_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
    int checkedNodeCount = 0;

    if (e.Node.Parent != null && !e.Node.Parent.Checked)
        e.Cancel = true;
    else
    {
        foreach (TreeNode node in tvRecipes.Nodes)
        {
            if (node.Checked)
                ++checkedNodeCount;

            if (checkedNodeCount > 2)
            {
                MessageBox.Show("Only one recipe can be selected at a time, please deselect the current recipe and try again.", "Too Many Recipes Selected", MessageBoxButtons.OK, MessageBoxIcon.Error);

                e.Cancel = true;
            }
        }
    }

经过一番折腾后,我找到了我想要的解决方案。我已将其发布在下面:

private bool CheckNumOfSelectedChildern(TreeViewEventArgs e)
{
    bool Valid = true;
    int selectedChildern = 0;

    foreach (TreeNode node in tvRecipes.Nodes)
    {
        if (node.Checked)
        {
            foreach (TreeNode child in node.Nodes)
            {
                if (child.Checked)
                    ++selectedChildern;
            }
        }
    }

    if (selectedChildern > 1)
    {
        MessageBox.Show("Only one recipe per category can be selected at a time, please deselect the current recipe and try again.", "Too Many Recipes Selected", MessageBoxButtons.OK, MessageBoxIcon.Error);
        e.Node.Checked = false;
        e.Node.Parent.Checked = false;
        Valid = false;
    }       
    return Valid;
}

private bool CheckNumOfSelectedParents(TreeViewEventArgs e)
{
    bool Valid = true;
    int selectedParent = 0;

    foreach (TreeNode root in tvRecipes.Nodes)
    {
        if (root.Checked)
            ++selectedParent;
    }

    if (selectedParent > 1)
    {
        MessageBox.Show("Only one recipe category can be selected at a time, please deselect the current recipe and try again.", "Too Many Recipes Selected", MessageBoxButtons.OK, MessageBoxIcon.Error);
        e.Node.Checked = false;
        Valid = false;
    }
    return Valid;
}

private void tvRecipes_BeforeCheck(object sender, TreeViewCancelEventArgs e)
{
    if (e.Node.Parent != null && !e.Node.Parent.Checked)
        e.Cancel = true;
    else if (e.Node.Checked)
    {
        foreach (TreeNode child in e.Node.Nodes)
        {
            if (child.Checked)
                e.Cancel = true;
        }
    }
}

private void tvRecipes_AfterCheck(object sender, TreeViewEventArgs e)
{
    if (CheckNumOfSelectedParents(e))
    {
        if (e.Node.Parent != null && e.Node.Parent.Checked)
        {
            if (e.Node.Checked)
            {
                if (CheckNumOfSelectedChildern(e))
                {
                    RecipeDs = RetrieveRecipe.FillRecipeDs(e.Node.Text);
                    DataBindControls();
                }                    
            }
            else
            {
                RemoveLabelsFromLayout();
                RemoveDataBindings();
                RecipeDs.Clear();
                this.Refresh();
            }
        }
    }
}

您的 if (checkedNodeCount > 2)... 应该位于 foreach 循环之外。

在 for 循环内,每次都会运行它。我猜这就是你所说的“表现古怪”

也许您应该更详细地说明什么是不正确的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查 TreeView 中选中的节点数 的相关文章

随机推荐

  • Umbraco 5询问用户是否有节点权限

    我正在使用 Umbraco 5 1 beta 在互联网上 此信息来自以前的版本 找不到最新的文档 我发现我可以询问节点用户是否具有访问权限 这样我想建立我的菜单 问题是 我无法让它工作 HasAccess 和 IsProtected 属性不
  • 如何使用 SwiftUI 扩展按钮的宽度

    我不知道如何更改 SwiftUI 中按钮的宽度 我已经尝试过 使用 frame minWidth 0 maxWidth infinity 在按钮和导航链接周围使用 Spacer 在文本字段上使用框架并在按钮上使用填充 查看文档以及我在网上搜
  • 为什么 PHP 对象运算符在浏览器中被视为结束标记? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • 使用其他数组对对象数组进行排序

    我创建了这个对象数组 const palette color Blue brightness Soft color Blue brightness Medium color Blue brightness Principal color M
  • Magento 重写 getPrice()

    我已经通过覆盖 Magento 产品的价格规则getPrice 方法在 Mage Catalog Model Product Type Price 类 简单的产品工作正常 并显示我在中提到的更新价格getPrice i e public f
  • Haproxy ssl重定向握手失败

    我有 haproxy v1 5 4 可以使用 http 和 https 我将 80 和 443 绑定到相同的前端并使用相同的 acl 我想创建一个 http gt https 重定向 frontend http in bind 80 bin
  • NSXMLparser 错误代码 5

    我在我的应用程序中使用亚马逊的 simpledb 解析 xml 时出现错误 代码为 5 IE NSXMLParserErrorDomain 错误 5 有时它工作正常 并且导航没有任何重大变化就会出现该错误 当我多次重新启动应用程序而无需对系
  • Android:如何在主项目中使用测试项目

    我想在 Eclipse 中创建这样的项目结构 并将其与 Maven 一起使用 MyProject AndroidManifest xml res resources for main application src source code
  • div元素中额外空间的解决方案

    在我的应用程序中我使用的是div元素 div 元素下方和上方有一些额外的空间 我怎样才能删除它 Thanks 每个浏览器都有自己的各种元素的边距和填充的默认值 所以除非你明确设置例如 div margin 0 padding 0 在你的 C
  • 如何在不创建数据库的情况下保存谜语游戏的答案?

    我创建了一个具有不同级别的问答游戏 每个级别都包含一个问题 我没有用数据库创建它 我只是用了字符串 当用户回答第一级的问题时 他会被带到第二级 但是当用户返回到第一级时 他必须再次输入答案 即使他之前已经解决了该问题 无论如何 JAVA 是
  • Firemonkey Delphi TWebBrowser 获取文本/HTML

    我如何从 Firemonkey 平台 Android iOS 上的网页获取文本 html TWebBrowser 没有任何这方面的东西 经过一些测试 我结合了JAVAScript和Delphi代码 有一个workground 请参考我的文章
  • 不带列名的动态汇总

    如何根据列的字符串数组动态构造汇总语句 deviceTelemetry summarize
  • Node 7.1.0 new Promise() 解析器未定义不是函数

    我在 OSX 上使用最新的节点版本 7 1 0 但我仍然无法使用 Promises 我明白了 index js new Promise Error new Promise 类型错误 未定义的承诺解析器不是函数 Node 7 1 0不支持ES
  • 访问模块内的 IRQ 描述数组并显示操作名称

    我正在用 C 语言编写一个内核模块 该模块正在努力访问 IRQ 描述数组元素并显示这些元素的所有操作名称 一开始 我认为这个 irq desc 数组就像一个宏 但编译后我明白它不是 然后我使用了 for each irq desc irq
  • 安装 python 模块时出错

    我正在尝试使用标准安装 python 模块python setup py install但我收到以下错误 我对 python 相当陌生 但过去我已经能够以这种方式安装其他模块 我对这个模块的印象setuptools不是我应该从我的 pyth
  • 将初始查询集限制为 django-rest 框架中分页中的对象

    我正在定义一个ModelViewSet using django rest framework 我需要覆盖默认查询集 以便在渲染响应之前对查询集对象执行一些处理 这个过程非常耗时 因此我只想在由于分页响应而实际可供消费者使用的对象上执行它
  • oracle 18中通过json_table解析json

    有一个请求例如 with j sJson as select ID 1444284517 ID ORD 4255 2187606199 Vals CODE ONB2B3BB8 DORD 25 04 2021 from dual select
  • 如何在 RxSwift 中检测可观察对象在特定时间内是否未发出任何事件

    我正在尝试检测是否有可观察的 我的情况按钮 rx tap 在 3 秒内没有发出任何值 如果是的话 我想更新用户界面 到目前为止 这是我的尝试 Observable
  • Struts 2 - 了解 OGNL 和参数拦截器之间的工作原理

    我是 Struts 2 的新手 我正在从 Struts2 In Action 一书中学习它 我很难理解 OGNL 中的一些概念 如下所示 我们知道params拦截器将数据从请求参数移动到操作对象中ValueStack 现在 在阅读时 我看到
  • 检查 TreeView 中选中的节点数

    我是使用树视图的新手 我希望能够确保树视图只能检查一个子节点 如果有人尝试检查多个子节点 它会停止检查事件并取消选择所有父节点和子节点 我该怎么做呢 到目前为止 这就是我所得到的 但它表现得很奇怪 有什么建议么 Update 为了澄清一些事