2011-01-28 13 views
19

をチェックボックスを削除しますいない。 チェックボックスを外してイメージとラインをそこに置くにはどうすればいいですか?あなたはあなたは、単にシステムを許可している、その種類のタイプの残りの部分については5または6のいずれかであるすべてのノードのために自分自身を描画処理している、示されたコードでツリービュー私はNode.Typeが、私はこのコードを使用して5または6であるチェックボックスを削除したいいくつかのノードで

This is wrong!

+0

可能重複](http://stackoverflow.com/questions/4179522/i-am-looking-for-a-good-resource-on-ownerdrawn-treeviews) –

+0

私はHansに同意します。所有者引き分けは一般的に困難です。あなたが主張するならば、私は[この質問]への回答として与えられたオーナー描画ツリービューのより完全なサンプルを見つけました(http://stackoverflow.com/questions/1003459/c-treeview-owner-drawing-with-ownerdrawtext- and-the-weird-black-highlighting-wh/1004087)、ノードラインがあります。 –

答えて

63

ノードをデフォルトの方法で描画します。そういうわけで、彼らはすべて期待通りのラインを持っていますが、あなたが所有しているものは描画していません。ラインに描画するのを忘れました!あなたは、あなたがe.DrawDefault = false;と言うとき、それがあなたが本当にそれを意味すると仮定しているのを見ます。標準線を含む通常の描画は行われません。

あなたはその行を自分で描く必要があります。または、オーナー描画なしでどうやって得るかを理解する必要があります。

あなたが今持っているコードから、システムのネイティブ描画スタイルをオーナー描画コードでできるだけシミュレートしようとしているように見えます。オーナー描画によって正確に何が達成されたのかはわかりません最初はタイプ5と6のノード(行のように、描画していないため単純に描画されていないタイプ)に対してチェックボックスが表示されないようにしようとしているのであれば、所有者を関与させることなく簡単に行うことができますお絵かき。


個々のノードのチェックボックスを非表示にする簡単な方法は何ですか?さて、実際にはTreeViewコントロール自体がこれをサポートしていますが、その機能は.NET Frameworkでは公開されていません。 P/Invokeを呼び出してWindows APIを呼び出す必要があります。 (あなたがSystem.Runtime.InteropServicesためusing宣言を追加したことを確認してください)フォームクラスに次のコードを追加します。上部の

private const int TVIF_STATE = 0x8; 
private const int TVIS_STATEIMAGEMASK = 0xF000; 
private const int TV_FIRST = 0x1100; 
private const int TVM_SETITEM = TV_FIRST + 63; 

[StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)] 
private struct TVITEM 
{ 
    public int mask; 
    public IntPtr hItem; 
    public int state; 
    public int stateMask; 
    [MarshalAs(UnmanagedType.LPTStr)] 
    public string lpszText; 
    public int cchTextMax; 
    public int iImage; 
    public int iSelectedImage; 
    public int cChildren; 
    public IntPtr lParam; 
} 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, 
             ref TVITEM lParam); 

/// <summary> 
/// Hides the checkbox for the specified node on a TreeView control. 
/// </summary> 
private void HideCheckBox(TreeView tvw, TreeNode node) 
{ 
    TVITEM tvi = new TVITEM(); 
    tvi.hItem = node.Handle; 
    tvi.mask = TVIF_STATE; 
    tvi.stateMask = TVIS_STATEIMAGEMASK; 
    tvi.state = 0; 
    SendMessage(tvw.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi); 
} 

厄介なもののすべては、あなたのP /呼び出し宣言されています。ツリービュー項目の属性を記述するTVITEM structureと、SendMessage functionといういくつかの定数が必要です。一番下には、その行為を行うために実際に呼び出す関数(HideCheckBox)があります。 TreeViewコントロールと、チェックマークを削除する特定のTreeNodeアイテムを渡します。

      TreeView with checkmarks hidden for child nodes

+0

@Werewolve:まあ、おそらく私はそれが「もっと簡単である」ことを忘れていました。私は個人的には、私はそれに精通しているので、所有者の描画が右に行くことは難しいので、より簡単だと思う。基本的に、TreeViewコントロール自体は個々のノードのチェックボックスを隠すことをサポートしていますが、その機能は.NET Frameworkでは公開されていません。あなたはそれを得るためにP/Invokeする必要があります。あなたが望むなら、私は答えをcodezで更新します。 –

+0

@Charith:はい、owner-drawを超えています(関係する作業とネイティブのTreeViewコントロールのように見える/動作しないので、どちらもしたくないと確信しています)。それをやる。ネイティブのWin32 APIから関数を呼び出すためにP/Invokeを使用しているため、奇妙で複雑なように見えますが、それはそれに関する奇妙な部分です。 CまたはC++のプログラマがこれを行う方法とまったく同じです。何かを起こすには奇妙な.NETの規約は必要ありません。しかし、P/Invokeの使用について心配するべきではありません。なぜなら、理由のためにフレームワークに組み込まれているからです。 –

+5

このコードの障害モードの解決方法を確認するには、次の回答を確認してください。http://stackoverflow.com/questions/7308238/treeview-problem-with-treenode-handle-not-returning/7308950#7308950 –

4

これは非常に良いです:

は、だから、このようなものを取得するには子ノードのそれぞれからチェックマークを削除することができます!私が行う唯一の修正は、の方法ではTreeViewではなく、TreeNodeだけを渡すことです。 TreeViewTreeNode自体から取り出すことができる。

TreeView tvw = node.TreeView; 
13

TreeViewExtensionsを使用します。

使用サンプル:ここに

private void MyForm_Load(object sender, EventArgs e) 
{ 
    this.treeview1.DrawMode = TreeViewDrawMode.OwnerDrawText; 
    this.treeview1.DrawNode += new DrawTreeNodeEventHandler(arbolDependencias_DrawNode); 
} 

void treeview1_DrawNode(object sender, DrawTreeNodeEventArgs e) 
{ 
    if (e.Node.Level == 1) e.Node.HideCheckBox(); 
    e.DrawDefault = true; 
} 

は、あなたが行うことができ、これを使用して、拡張メソッドなどの答えのコードです:[私はownerdrawnツリービュー上での優れたリソースを探していますの

public static class TreeViewExtensions 
{ 
    private const int TVIF_STATE = 0x8; 
    private const int TVIS_STATEIMAGEMASK = 0xF000; 
    private const int TV_FIRST = 0x1100; 
    private const int TVM_SETITEM = TV_FIRST + 63; 

    [StructLayout(LayoutKind.Sequential, Pack = 8, CharSet = CharSet.Auto)] 
    private struct TVITEM 
    { 
     public int mask; 
     public IntPtr hItem; 
     public int state; 
     public int stateMask; 
     [MarshalAs(UnmanagedType.LPTStr)] 
     public string lpszText; 
     public int cchTextMax; 
     public int iImage; 
     public int iSelectedImage; 
     public int cChildren; 
     public IntPtr lParam; 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto)] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, 
              ref TVITEM lParam); 

    /// <summary> 
    /// Hides the checkbox for the specified node on a TreeView control. 
    /// </summary> 
    public static void HideCheckBox(this TreeNode node) 
    { 
     TVITEM tvi = new TVITEM(); 
     tvi.hItem = node.Handle; 
     tvi.mask = TVIF_STATE; 
     tvi.stateMask = TVIS_STATEIMAGEMASK; 
     tvi.state = 0; 
     SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, ref tvi); 
    } 
} 
関連する問題