C#TreeView在数据和显示之间变得不匹配

C#TreeView在数据和显示之间变得不匹配,c#,windows,winforms,C#,Windows,Winforms,我有一个带复选框的树视图,比如 我添加了一些代码来显示所选内容: /// <summary> /// Highlight checked nodes /// </summary> private void HighlightCheckedNodes() { foreach (TreeNode topNode in treeView1.Nodes) { if (topNode.

我有一个带复选框的树视图,比如

我添加了一些代码来显示所选内容:

    /// <summary>
    /// Highlight checked nodes
    /// </summary>
    private void HighlightCheckedNodes()
    {
        foreach (TreeNode topNode in treeView1.Nodes)
        {
            if (topNode.Checked)
            {
                topNode.BackColor = Color.Yellow;
            }
            else
            {
                topNode.BackColor = Color.White;
            }

            foreach (TreeNode myNode in topNode.Nodes)
            {
                // Check whether the tree node is checked.
                if (myNode.Checked)
                {
                    // Set the node's backColor.
                    myNode.BackColor = Color.Yellow;
                }
                else
                {
                    myNode.BackColor = Color.White;
                }
            }
        }
    }
//
///高亮显示选中的节点
/// 
私有void HighlightCheckedNodes()
{
foreach(TreeView.Nodes中的TreeNode topNode)
{
如果(topNode.Checked)
{
topNode.BackColor=Color.Yellow;
}
其他的
{
topNode.BackColor=Color.White;
}
foreach(topNode.Nodes中的treenodemynode)
{
//检查树节点是否已选中。
if(myNode.Checked)
{
//设置节点的背景色。
myNode.BackColor=Color.Yellow;
}
其他的
{
myNode.BackColor=Color.White;
}
}
}
}
此函数从TreeView w1_AfterSelect和TreeView w1_AfterCheck调用。 如果我单击几次,就会得到一些标记为选中但不是黄色的节点(数据显示未选中),反之亦然

那么,我如何确保数据和显示同步呢?

长话短说,就是这样

下面是一个使用NativeWindow而不是从TreeView派生的实现。这将允许您使用表单上现有的TreeView:

public partial class Form1 : Form
{

    private TreeViewSuppressDoubleClick treeViewHelper;

    private void Form1_Load(object sender, EventArgs e)
    {
        treeViewHelper = new TreeViewSuppressDoubleClick(this.treeView1);
    }

    public class TreeViewSuppressDoubleClick : NativeWindow
    {

        public TreeViewSuppressDoubleClick(TreeView treeView)
        {
            if (treeView != null && treeView.IsHandleCreated)
            {
                this.AssignHandle(treeView.Handle);
            }
        }

        protected override void WndProc(ref Message m)
        {
            if (m.Msg != 0x203)
                base.WndProc(ref m);
        }

    }
    private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
    {
        e.Node.BackColor = e.Node.Checked ? Color.Yellow : Color.White;
    }

}
在这之后,你会注意到TreeView对点击没有那么敏感,但它现在确实保持同步

请注意在选中/取消选中时更改背景色的简化方法

此外,这里还有一个备用的HighlightCheckedNodes(),使用递归获取所有节点:

private void HighlightCheckedNodes(TreeNode node)
{
    if (node == null)
    {
        foreach (TreeNode topNode in treeView1.Nodes)
        {
            HighlightCheckedNodes(topNode);
        }
    }
    else
    {
        node.BackColor = node.Checked ? Color.Yellow : Color.White;
        foreach (TreeNode curNode in node.Nodes)
        {
            HighlightCheckedNodes(curNode);
        }
    }
}
您可以使用
HighlightCheckedNodes(null)调用它