を含むTreeView
Windows フォーム コントロールがありImageList
、一部のノードに画像を表示させたいが、他のノードには画像を表示させたくない。
画像があるべき場所に空白を入れたくありません。ImageList がない場合に TreeView が描画する線のように見える画像は必要ありません。そのような不器用なハックに頼ることなく、一部のアイテムの画像を描画し、他のアイテムの画像を描画しないようにするにはどうすればよいですか?
ImageIndex
とSelectedImageIndex
を の値の数よりも大きい数に設定する必要があります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 )
私が選択したのは、画像TreeView
を持たないはずのノードにドットの画像を使用することです。
この画像をリストの最後の画像として追加し、アイテムに画像が含まれていない場合は、設定しますImageList.Images.Count-1
ImageList の代わりに TreeView で StateImageList を使用すると、TreeNode の StateImageIndex が 0 以上の場合にのみ画像が表示されることがわかりました。
私はこれを一度試しましたが、それは不可能だと思います。
両方を設定し、「設定しない」値にしようとするとImageKey
、ImageIndex
コントロールはデフォルト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
この種のことは、コントロールの開発者が常に既定の画像が存在することを確認したかったことを示しています。それは私が恐れているハックオプションをあなたに残すだけです.
これによりTreeNode
、画像があったはずの場所にテキストが描画され、空白が取り除かれます。
TreeView
のDrawMode
プロパティをに設定する必要がありますOwnerDrawText
。DrawMode
プロパティ パネルでプロパティを見つけることができます。
次に、ノードを追加するときに、その値を自分の値より大きく設定ImageIndex
しSelectedImageIndex
ます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);
ねえ仲間、私は方法を見つけました。このように、最初の画像を空の画像として設定します...
TreeView treeView = new TreeView();
treeView.ImageList.Images.Add(new Bitmap(1,1));
したがって、インデックス 0 は空のイメージです。これが役立つことを願っています