我有一个treeview和一个包含1个图标的imageList(folder.ico),我只想为根节点设置图标,子节点没有图标,所以我尝试为子节点设置图像索引但是它有一些问题,看看图片:
我的代码:
ImageList imageList = new ImageList();
imageList.Images.Add(Image.FromFile(System.AppDomain.CurrentDomain.BaseDirectory.Replace("\\bin\\Debug\\","") + "\\Images\\folder.ico"), Color.Transparent);
treeView1.ImageList = imageList;
foreach (TreeNode node in treeView1.Nodes)
{
foreach (TreeNode node2 in node.Nodes)
{
node2.ImageIndex = 100;
node2.SelectedImageIndex = 100;
}
}
由于
修改 我在@Killercam的答案中创建了一个Custom TreeView:
class CustomTreeView : TreeView
{
public const int NOIMAGE = -1;
public CustomTreeView()
: base()
{
// .NET Bug: Unless LineColor is set, Win32 treeview returns -1 (default), .NET returns Color.Black!
base.LineColor = SystemColors.GrayText;
base.DrawMode = TreeViewDrawMode.OwnerDrawAll;
}
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
// Space between Image and Label.
const int SPACE_IL = 3;
// We only do additional drawing.
e.DrawDefault = true;
base.OnDrawNode(e);
if (base.ShowLines && base.ImageList != null && e.Node.ImageIndex == NOIMAGE
// exclude root nodes, if root lines are disabled
//&& (base.ShowRootLines || e.Node.Level > 0))
)
{
// Using lines & images, but this node has none: fill up missing treelines
// Image size
int imgW = base.ImageList.ImageSize.Width;
int imgH = base.ImageList.ImageSize.Height;
// Image center
int xPos = e.Node.Bounds.Left - SPACE_IL - imgW / 2;
int yPos = (e.Node.Bounds.Top + e.Node.Bounds.Bottom) / 2;
// Image rect
Rectangle imgRect = new Rectangle(xPos, yPos, 0, 0);
imgRect.Inflate(imgW / 2, imgH / 2);
using (Pen p = new Pen(base.LineColor, 1))
{
p.DashStyle = DashStyle.Dot;
// Account uneven Indent for both lines.
p.DashOffset = base.Indent % 2;
// Horizontal treeline across width of image
// account uneven half of delta ItemHeight & ImageHeight.
int yHor = yPos + ((base.ItemHeight - imgRect.Height) / 2) % 2;
//if (base.ShowRootLines || e.Node.Level > 0)
//{
// e.Graphics.DrawLine(p, imgRect.Left, yHor, imgRect.Right, yHor);
//}
//else
//{
// // for root nodes, if root lines are disabled, start at center
// e.Graphics.DrawLine(p, xPos - (int)p.DashOffset, yHor, imgRect.Right, yHor);
//}
e.Graphics.DrawLine(p,
(base.ShowRootLines || e.Node.Level > 0) ? imgRect.Left : xPos - (int)p.DashOffset,
yHor, imgRect.Right, yHor);
if (!base.CheckBoxes && e.Node.IsExpanded)
{
// Vertical treeline , offspring from NodeImage center to e.Node.Bounds.Bottom
// yStartPos: account uneven Indent and uneven half of delta ItemHeight & ImageHeight
int yVer = yHor + (int)p.DashOffset;
e.Graphics.DrawLine(p, xPos, yVer, xPos, e.Node.Bounds.Bottom);
}
}
}
}
protected override void OnAfterCollapse(TreeViewEventArgs e)
{
base.OnAfterCollapse(e);
if (!base.CheckBoxes && base.ImageList != null && e.Node.ImageIndex == NOIMAGE)
{
// DrawNode event not raised: redraw node with collapsed treeline
base.Invalidate(e.Node.Bounds);
}
}
}
然后在我的代码中使用它:
private void TestCustomTreeView_Load(object sender, EventArgs e)
{
// @Killercam EDIT: Set the default Image to one that is not used.
valForm.siteTreeView.ImageIndex = 100;
valForm.siteTreeView.SelectedImageIndex = 100;
TemplateCustomTreeView myTree = new TemplateCustomTreeView();
myTree.Font = new System.Drawing.Font("Tahoma", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
myTree.Location = new System.Drawing.Point(6, 26);
myTree.Name = "tree";
myTree.Scrollable = true;
myTree.Size = new System.Drawing.Size(320, 296);
myTree.ImageList = imageList1;
/*Add item*/
TreeNode node = new TreeNode();
node.Name = "abc1";
node.Text = "abc1";
node.ImageIndex = 0;
myTree.Nodes.Add(node);
TreeNode node3 = new TreeNode();
node3.Name = "abc2";
node3.Text = "abc2";
node3.ImageIndex = -1;
node.Nodes.Add(node3);
////
TreeNode node2 = new TreeNode();
node2.Name = "abc3";
node2.Text = "abc3";
node2.ImageIndex = 0;
myTree.Nodes.Add(node2);
this.Controls.AddRange(new System.Windows.Forms.Control[] { myTree });
}
}
结果仍然不起作用,它在文本前仍然有一个文件夹图标!
答案 0 :(得分:2)
你不能做你需要的事情
"All I want is don't show icon at child node."
不覆盖控件。我还发现您无法使用标准WinForms TreeView
为不同节点显示不同的图像。下面是一些使TreeView看起来更好的代码;这将为子节点绘制树线的小部分。
class CustomTreeView : TreeView
{
public const int NOIMAGE = -1;
public CustomTreeView()
: base()
{
// .NET Bug: Unless LineColor is set, Win32 treeview returns -1 (default), .NET returns Color.Black!
base.LineColor = SystemColors.GrayText;
base.DrawMode = TreeViewDrawMode.OwnerDrawAll;
}
protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
// Space between Image and Label.
const int SPACE_IL = 3;
// We only do additional drawing.
e.DrawDefault = true;
base.OnDrawNode(e);
if (base.ShowLines && base.ImageList != null && e.Node.ImageIndex == NOIMAGE
// exclude root nodes, if root lines are disabled
//&& (base.ShowRootLines || e.Node.Level > 0))
)
{
// Using lines & images, but this node has none: fill up missing treelines
// Image size
int imgW = base.ImageList.ImageSize.Width;
int imgH = base.ImageList.ImageSize.Height;
// Image center
int xPos = e.Node.Bounds.Left - SPACE_IL - imgW / 2;
int yPos = (e.Node.Bounds.Top + e.Node.Bounds.Bottom) / 2;
// Image rect
Rectangle imgRect = new Rectangle(xPos, yPos, 0, 0);
imgRect.Inflate(imgW / 2, imgH / 2);
using (Pen p = new Pen(base.LineColor, 1))
{
p.DashStyle = DashStyle.Dot;
// Account uneven Indent for both lines.
p.DashOffset = base.Indent % 2;
// Horizontal treeline across width of image
// account uneven half of delta ItemHeight & ImageHeight.
int yHor = yPos + ((base.ItemHeight - imgRect.Height) / 2) % 2;
//if (base.ShowRootLines || e.Node.Level > 0)
//{
// e.Graphics.DrawLine(p, imgRect.Left, yHor, imgRect.Right, yHor);
//}
//else
//{
// // for root nodes, if root lines are disabled, start at center
// e.Graphics.DrawLine(p, xPos - (int)p.DashOffset, yHor, imgRect.Right, yHor);
//}
e.Graphics.DrawLine(p,
(base.ShowRootLines || e.Node.Level > 0) ? imgRect.Left : xPos - (int)p.DashOffset,
yHor, imgRect.Right, yHor);
if (!base.CheckBoxes && e.Node.IsExpanded)
{
// Vertical treeline , offspring from NodeImage center to e.Node.Bounds.Bottom
// yStartPos: account uneven Indent and uneven half of delta ItemHeight & ImageHeight
int yVer = yHor + (int)p.DashOffset;
e.Graphics.DrawLine(p, xPos, yVer, xPos, e.Node.Bounds.Bottom);
}
}
}
}
protected override void OnAfterCollapse(TreeViewEventArgs e)
{
base.OnAfterCollapse(e);
if (!base.CheckBoxes && base.ImageList != null && e.Node.ImageIndex == NOIMAGE)
{
// DrawNode event not raised: redraw node with collapsed treeline
base.Invalidate(e.Node.Bounds);
}
}
}
这将为您提供如下所示的TreeView:
此处,我的主节点(Node[0]
)是没有指定Image
的节点,是您File1
/ File2
个节点所需的节点。
我希望这会有所帮助。
答案 1 :(得分:1)
目前,您创建的图像列表只包含一个图像(索引0)
行treeView1.ImageList = imageList;
将该列表链接到树视图
行node2.ImageIndex = 100;
链接要显示的列表上的索引100(不存在)的图像
列表中只有一个图像,这意味着您只有索引为0的图像。
所以试试:
node2.ImageIndex = 0;
node2.SelectedImageIndex = 0;
答案 2 :(得分:0)
尝试使用空白图像文件?
(或者只包含水平点画线或箭头的那个......)