web-dev-qa-db-ja.com

TreeViewのすべてではなく一部のノードに画像を設定するにはどうすればよいですか?

TreeViewウィンドウフォームコントロールとImageListがあり、一部のノードに画像を表示させたいが、他のノードには画像を表示させたくない。

I しないでください画像があるべき場所に空白が必要です。 I しない ImageListがない場合にTreeViewが描画する線のような画像が必要です。そのような不器用なハックに頼ることなく、他のアイテムではなく一部のアイテムの画像を描画するにはどうすればよいですか?

20
Simon

私はこれを一度試しましたが、それは不可能だと思います。

ImageKeyImageIndexの両方を「未設定」の値に設定しようとすると、コントロールはデフォルトでImageIndexを0に設定します。次のコード:

treeView.ImageKey = "Value";
Debug.WriteLine(treeView.ImageIndex);
treeView.ImageKey = null;
Debug.WriteLine(treeView.ImageIndex);
treeView.ImageIndex = -1;
Debug.WriteLine(treeView.ImageIndex);

出力を生成します:

-1
0
0

この種のことは、コントロール開発者が常にデフォルトのイメージが存在することを確認したかったことを示しています。それは私が恐れているハックオプションをあなたに残すだけです。

8
Martin Brown

ImageIndexSelectedImageIndexを、ImageListの値の数よりも大きい数に設定する必要があります。たとえば、このノードを作成してTreeViewに追加すると、次のようになります。

TreeNode node1 = new TreeNode(string.Empty, 12, 12); // imageList1.Count = 5

目に見えないTreeNodeTreeViewに挿入されます。 TreeViewの背景色を変更しましたが、まだ見えませんでした。

(私はしばらくの間これをグーグルで検索しました、そして私は最終的にここで答えを見つけました: http://www.tech-archive.net/Archive/DotNet/Microsoft.public.dotnet.framework.windowsforms/2006-09/ msg00322.html

12
John Fischer

私が選択したのは、画像を持たないはずのTreeViewノードにドットの画像を使用することです。

TreeNode with image dots

この画像をリストの最後の画像として追加し、アイテムに画像が含まれていない場合は、ImageList.Images.Count-1に設定します。

9
MtnManChris

ImageListの代わりにTreeViewでStateImageListを使用すると、TreeNodeのStateImageIndexが0以上の場合にのみ画像が表示されることがわかりました。

8
Aussie Ash

これにより、画像があるべき場所にTreeNodeテキストが描画され、空白が削除されます。

TreeViewDrawModeプロパティをOwnerDrawTextに設定する必要があります。 DrawModeプロパティはプロパティパネルにあります。

次にノードを追加するときは、ノードをImageIndexおよびSelectedImageIndexyourImageListName.Images.Count値の値よりも大きく設定します。これは画像が描画されないようにするためですが、不要な空白は残ります。

さて、空白を取り除きます。 treeviews DrawNodeイベントのハンドルを追加します。これを行うには、treeviewsプロパティパネルに移動し、照明ボルトのように見えるパネルのアイコンをクリックしてから、テキストDrawNodeが表示されるまでスクロールし、ダブルクリックします。

これをコピーして、作成したメソッドに貼り付けるだけです。

if (e.Node.ImageIndex >= e.Node.TreeView.ImageList.Images.Count) // if there is no image
{
    int imagewidths = e.Node.TreeView.ImageList.ImageSize.Width;
    int textheight = TextRenderer.MeasureText(e.Node.Text, e.Node.NodeFont).Height;
    int x = e.Node.Bounds.Left - 3 - imagewidths / 2;
    int y = (e.Bounds.Top + e.Bounds.Bottom) / 2+1;

    Point point = new Point(x - imagewidths/2, y - textheight/2); // the new location for the text to be drawn

    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.NodeFont, point, e.Node.ForeColor);
}
else // drawn at the default location
    TextRenderer.DrawText(e.Graphics, e.Node.Text, e.Node.TreeView.Font, e.Bounds, e.Node.ForeColor);
3
user1887120

ヘイブロ、私は方法を見つけました。このように、最初の画像を空の画像として設定します...

TreeView treeView = new TreeView();
treeView.ImageList.Images.Add(new Bitmap(1,1));

したがって、インデックス0は空のイメージです。これがお役に立てば幸いです

0
Rogerio Souza