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)调用它代码>