检查树视图检查节点数 [英] Check number of checked nodes in TreeView

查看:153
本文介绍了检查树视图检查节点数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新来使用树的意见,我希望能够确保树视图中只能有一个子节点检查,如果有人试图检查不止一个停止检查事件,并取消选择所有父和子节点。我怎么会去这样做呢?到目前为止,这是我已经有了,但它的行为古怪。有什么建议?

更新::要澄清一些事情,这是一个双赢的形式TreeView和父节点是一个类别,每个类别可以包含多个项目。我只希望用户能够选择在同一时间从类别一类和一个项目。

 私人无效tvRecipes_BeforeCheck(对象发件人,TreeViewCancelEventArgs E)
{
    INT checkedNodeCount = 0;

    如果(e.Node.Parent = NULL和放大器;!&安培;!e.Node.Parent.Checked)
        e.Cancel =真;
    其他
    {
        的foreach(在tvRecipes.Nodes树节点的节点)
        {
            如果(node.Checked)
                ++ checkedNodeCount;

            如果(checkedNodeCount→2)
            {
                的MessageBox.show(只有一个配方,可以在同一时间选择,请取消当前的配方,然后再试一次。,太多的食谱选择,MessageBoxButtons.OK,MessageBoxIcon.Error);

                e.Cancel =真;
            }
        }
    }
 

经过一番插科打诨我想出了解决办法,我是后。我已经把它贴如下:

 私人布尔CheckNumOfSelectedChildern(TreeViewEventArgs E)
{
    布尔有效= TRUE;
    INT selectedChildern = 0;

    的foreach(在tvRecipes.Nodes树节点的节点)
    {
        如果(node.Checked)
        {
            的foreach(树节点的孩子在node.Nodes)
            {
                如果(child.Checked)
                    ++ selectedChildern;
            }
        }
    }

    如果(selectedChildern→1)
    {
        的MessageBox.show(只有一个配方每类可以在同一时间选择,请取消当前的配方,然后再试一次。,太多的食谱选择,MessageBoxButtons.OK,MessageBoxIcon.Error);
        e.Node.Checked = FALSE;
        e.Node.Parent.Checked = FALSE;
        有效值= FALSE;
    }
    返回有效的;
}

私人布尔CheckNumOfSelectedParents(TreeViewEventArgs E)
{
    布尔有效= TRUE;
    INT selectedParent = 0;

    的foreach(在tvRecipes.Nodes树节点根)
    {
        如果(root.Checked)
            ++ selectedParent;
    }

    如果(selectedParent→1)
    {
        的MessageBox.show(只有一个配方类可以同时被选中,请取消当前的配方,然后再试一次。,太多的食谱选择,MessageBoxButtons.OK,MessageBoxIcon.Error);
        e.Node.Checked = FALSE;
        有效值= FALSE;
    }
    返回有效的;
}

私人无效tvRecipes_BeforeCheck(对象发件人,TreeViewCancelEventArgs E)
{
    如果(e.Node.Parent = NULL和放大器;!&安培;!e.Node.Parent.Checked)
        e.Cancel =真;
    否则,如果(e.Node.Checked)
    {
        的foreach(树节点的孩子在e.Node.Nodes)
        {
            如果(child.Checked)
                e.Cancel =真;
        }
    }
}

私人无效tvRecipes_AfterCheck(对象发件人,TreeViewEventArgs E)
{
    如果(CheckNumOfSelectedParents(E))
    {
        如果(e.Node.Parent = NULL和放大器;!&安培; e.Node.Parent.Checked)
        {
            如果(e.Node.Checked)
            {
                如果(CheckNumOfSelectedChildern(E))
                {
                    RecipeDs = RetrieveRecipe.FillRecipeDs(e.Node.Text);
                    DataBindControls();
                }
            }
            其他
            {
                RemoveLabelsFromLayout();
                RemoveDataBindings();
                RecipeDs.Clear();
                this.Refresh();
            }
        }
    }
}
 

解决方案

希望这个作品:

 私人诠释_callCountUp;

        私人诠释_callCountDn;

私人无效tvwPermissions_AfterCheck(对象发件人,System.Windows.Forms.TreeViewEventArgs E)
        {
            布尔anyChecked = FALSE;

            如果(_callCountDn == 0安培;&安培;!e.Node.Parent = NULL)
            {
                anyChecked = FALSE;
                的foreach(树节点childNode在e.Node.Parent.Nodes)
                {
                    如果(childNode.Checked)
                    {
                        anyChecked = TRUE;
                        打破;
                    }
                }
                _callCountUp + = 1;

                如果(anyChecked)
                    e.Node.Parent.Checked = TRUE;

                _callCountUp  -  = 1;
            }

            如果(_callCountUp == 0)
            {
                的foreach(树节点childNode在e.Node.Nodes)
                {
                    _callCountDn + = 1;
                    childNode.Checked = e.Node.Checked;
                    _callCountDn  -  = 1;
                }
            }
        }
 

I am new to using tree views and I want to be able to make sure the tree view can only have one child node checked and if someone tries to check more then one it stops the check event and deselects all parent and child nodes. How would I go about doing this? So far this is what I've got but it is acting quirky. Any suggestions?

Update: To clarify some things this is a win form treeview and the parent node is a category and each category can contain multiple items. I only want the user to be able to select one category and one item from the category at a time.

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

After some messing around I figured out the solution I was after. I have posted it below:

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();
            }
        }
    }
}

解决方案

Hope this works:

private int _callCountUp;

        private int _callCountDn;

private void tvwPermissions_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)
        {
            bool anyChecked = false;

            if (_callCountDn == 0 && e.Node.Parent != null)
            {
                anyChecked = false;
                foreach (TreeNode childNode in e.Node.Parent.Nodes)
                {
                    if (childNode.Checked)
                    {
                        anyChecked = true;
                        break;
                    }
                }
                _callCountUp += 1;

                if (anyChecked)
                    e.Node.Parent.Checked = true;

                _callCountUp -= 1;
            }

            if (_callCountUp == 0)
            {
                foreach (TreeNode childNode in e.Node.Nodes)
                {
                    _callCountDn += 1;
                    childNode.Checked = e.Node.Checked;
                    _callCountDn -= 1;
                }
            }
        }

这篇关于检查树视图检查节点数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆