22

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

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

4

6 に答える 6

12

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

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

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

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

于 2009-06-17T20:55:48.977 に答える
11

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

画像ドット付きの TreeNode

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

于 2013-12-16T16:49:59.477 に答える
9

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

于 2015-07-20T01:55:29.527 に答える
8

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

両方を設定し、「設定しない」値にしようとすると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

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

于 2008-11-04T16:36:21.053 に答える
3

これによりTreeNode、画像があったはずの場所にテキストが描画され、空白が取り除かれます。

TreeViewDrawModeプロパティをに設定する必要がありますOwnerDrawTextDrawModeプロパティ パネルでプロパティを見つけることができます。

次に、ノードを追加するときに、その値を自分の値より大きく設定ImageIndexSelectedImageIndexますyourImageListName.Images.Count。これは画像が描画されないようにするためですが、不要な空白はまだ存在します。

これで、空白を取り除くことができます。treeviewsDrawNodeイベントのハンドルを追加します。これを行うには、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);
于 2013-02-03T02:47:08.560 に答える
0

ねえ仲間、私は方法を見つけました。このように、最初の画像を空の画像として設定します...

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

したがって、インデックス 0 は空のイメージです。これが役立つことを願っています

于 2015-07-09T19:43:06.977 に答える