从网上找了一个有TreeView的CheckBoxs的第三种状态(有部分子结点被选中)的代码,实现的时候发现,在点击node前的+的时候,图片也改变了,怎么让他不改变呢?
开始的时候,是下图
点击 子2 前的“+”,就变成了下面
怎么才能在点击节点的“+”的时候,node的图片不变?
代码如下:
开始的时候,是下图
点击 子2 前的“+”,就变成了下面
怎么才能在点击节点的“+”的时候,node的图片不变?
代码如下:
//规则1:取消选定
//规则1.1:检查能否有子节点,需清除全部子节点的选定状态;
//规则1.2:检查能否有父节点,如有,则根据兄弟节点的选定状态修改父节点的选定状态
//规则2:选定
//规则2.1:检查能否有子节点,设置全部子节点为选定状态
//规则2.2:检查能否有父节点,如有,则根据兄弟节点的选定状态修改父节点的选定状态
//我们用ImageIndex等于0、1、2分别代表该节点未选中、选中、子节点部分选中三种状态
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace TreeView
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 选中节点之后,选中节点的全部子节点
/// </summary>
/// <param name="currNode"></param>
/// <param name="state"></param>
private void setChildNodeCheckedState(TreeNode currNode, bool state)
{
TreeNodeCollection nodes = currNode.Nodes;
if (nodes.Count > 0)
foreach (TreeNode tn in nodes)
{
tn.Checked = state;
setChildNodeCheckedState(tn, state);
}
}
private void Form1_Load(object sender, EventArgs e)
{
this.treeView1.ImageList = imageList1;
treeView1.ImageIndex = 1;
treeView1.SelectedImageIndex = 1;
if (treeView1.Nodes.Count > 0)
{
if (treeView1.SelectedNode != null)
{
//this.treeView1.ImageList = imageList1;
//TreeNode newNode = new TreeNode("Parent");
//treeView1.SelectedNode.Nodes.Add(newNode);
//this.treeView1.SelectedNode.ImageIndex = 0;
//this.treeView1.SelectedNode.SelectedImageIndex = 1;
//this.setChildNodeCheckedState(this.treeView1.SelectedNode, true);
}
}
else
{
TreeNode node = new TreeNode();
node.Text = "根";
this.treeView1.Nodes.Add(node);
TreeNode node1 = new TreeNode();
node1.Text = "子1";
treeView1.Nodes[0].Nodes.Add(node1);
TreeNode node2 = new TreeNode();
node2.Text = "子2";
treeView1.Nodes[0].Nodes.Add(node2);
TreeNode node21 = new TreeNode();
node21.Text = "子21";
node2.Nodes.Add(node21);
TreeNode node3 = new TreeNode();
node3.Text = "子3";
treeView1.Nodes[0].Nodes.Add(node3);
}
}
private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e)
{
//if (e.Node.ImageIndex == 1)
//{
// e.Node.SelectedImageIndex = 0;
// e.Node.ImageIndex = 0;
// SetNodeImg11(e.Node);
// SetNodeImg12(e.Node);
//}
//else
//{
// e.Node.SelectedImageIndex = 1;
// e.Node.ImageIndex = 1;
// SetNodeImg21(e.Node);
// SetNodeImg22(e.Node);
//}
}
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node.ImageIndex == 1)
{
e.Node.SelectedImageIndex = 0;
e.Node.ImageIndex = 0;
SetNodeImg11(e.Node);
SetNodeImg12(e.Node);
}
else
{
e.Node.SelectedImageIndex = 1;
e.Node.ImageIndex = 1;
SetNodeImg21(e.Node);
SetNodeImg22(e.Node);
}
}
//设置节点选定状态:规则.1:检查能否有子节点,需清除全部子节点的选定状态;
private void SetNodeImg11(TreeNode tn)
{
foreach (TreeNode t in tn.Nodes)
{
t.SelectedImageIndex = 0;
t.ImageIndex = 0;
if (t.Nodes.Count != 0)
{
SetNodeImg11(t);
}
}
}
//设置节点选定状态:规则.2:检查能否有父节点,如有,则根据兄弟节点的选定状态修改父节点的选定状态
private void SetNodeImg12(TreeNode tn)
{
if (tn.Parent == null)
return;
int Img0Num = 0;
int Img1Num = 0;
int Img2Num = 0;
//统计兄弟节点中选中情况
foreach (TreeNode t in tn.Parent.Nodes)
{
if (t.ImageIndex == 0)
Img0Num++;
if (t.ImageIndex == 1)
Img1Num++;
if (t.ImageIndex == 2)
Img2Num++;
}
//假如兄弟节点中选中和未选中都有
if ((Img2Num != 0) || ((Img0Num != 0) && (Img1Num != 0)))
{
tn.Parent.SelectedImageIndex = 2;
tn.Parent.ImageIndex = 2;
}
else
{
tn.Parent.StateImageIndex = 0;
tn.Parent.ImageIndex = 0;
}
//递归
SetNodeImg12(tn.Parent);
}
//设置节点选定状态:规则.1:检查能否有子节点,设置全部子节点为选定状态
private void SetNodeImg21(TreeNode tn)
{
foreach (TreeNode t in tn.Nodes)
{
t.SelectedImageIndex = 1;
t.ImageIndex = 1;
if (t.Nodes.Count != 0)
{
SetNodeImg21(t);
}
}
}
//设置节点选定状态:规则.2:检查能否有父节点,如有,则根据兄弟节点的选定状态修改父节点的选定状态
private void SetNodeImg22(TreeNode tn)
{
if (tn.Parent == null)
return;
int Img0Num = 0;
int Img1Num = 0;
int Img2Num = 0;
//统计兄弟节点中选中情况
foreach (TreeNode t in tn.Parent.Nodes)
{
if (t.ImageIndex == 0)
Img0Num++;
if (t.ImageIndex == 1)
Img1Num++;
if (t.ImageIndex == 2)
Img2Num++;
}
//假如兄弟节点中选中和未选中都有
if ((Img2Num != 0) || ((Img0Num != 0) && (Img1Num != 0)))
{
tn.Parent.SelectedImageIndex = 2;
tn.Parent.ImageIndex = 2;
}
else if ((Img1Num == 0) && (Img2Num == 0))
{
tn.Parent.SelectedImageIndex = 0;
tn.Parent.ImageIndex = 0;
}
else
{
tn.Parent.StateImageIndex = 1;
tn.Parent.ImageIndex = 1;
}
//递归
SetNodeImg22(tn.Parent);
}
private void treeView1_AfterCheck(object sender, TreeViewEventArgs e)
{
// if (e.Node.ImageIndex == 1)
// {
// e.Node.SelectedImageIndex = 0;
// e.Node.ImageIndex = 0;
// SetNodeImg11(e.Node);
// SetNodeImg12(e.Node);
// }
// else
// {
// e.Node.SelectedImageIndex = 1;
// e.Node.ImageIndex = 1;
// SetNodeImg21(e.Node);
// SetNodeImg22(e.Node);
// }
}
private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
}
}
}
解决方案
40
改成一下代码,即可解决!
var bound = Rectangle.Union(e.Node.Bounds, new Rectangle(e.Node.Bounds.Location - new Size(19, 0), new Size(19, 15)));
if (bound.Contains(new Point(e.X, e.Y)))
{...}