2011-12-29 21 views
6

TreeViewの各ノードの横にボタンを追加するにはどうすればよいですか?TreeViewの各ノードの横にボタンを追加するにはどうすればよいですか?

+2

これまでどんなコードがありますか?ヒント:ボタンbtn = new Button()を使用すると、コード内にスタブする必要があります。 – MethodMan

+0

@DJKRAZE:これは動作しません。彼はツリービューでそれを望んでいます。 – SLaks

+0

これは不可能です。サードパーティのTreeViewが必要です。 – SLaks

答えて

10

ツリービューの各ノードの横にボタンを追加するのは難しいです。自分でツリービューの描画を処理し、ボタンを自分で描画したり、その機能をエミュレートしたり、子ボタンコントロールを作成してツリーコントロール内の適切な場所に表示したり、コントロールがスクロールしたときなどにそれらを再配置する必要があります。いずれにせよ、それは悪夢になるだろう。

幸運にも、簡単な方法があります。その複雑なものを何もする必要はありません。なぜなら、そうしないといけないからです!

ボタンでツリーコントロールを見たことがありますか?いいえ。したがって、ツリーコントロールにボタンがある場合は、エンドユーザーには奇妙なものが表示されます。

あなたがすべきことは、他のアプリケーションが、ボタン付きツリーコントロールを使わずに解決しようとしている問題を解決したかどうかを検討することです。ここで

+1

と思われます。ありがとうございました。 – Seva

+0

ええ...しかし、私はテキストボックスで1つが必要...まあまあですか?私は深いコピーツールを作成しています。チェックボックスと、ユーザーが各ノードの名前をツリーの名前に変更する機能が必要です。 : – LightStriker

+0

あなたはツリー内にノードがあるのと同じくらい多くのテキストボックスを必要としていますか?1つのテキストボックスはどのようにして、必要なときにのみ作成し、入力を終えるとすぐに破棄されますか? –

3

は、私は誰かが実際に、それはあなたがやろうとしていることは何か達成したCodeProjectの上のソースコードプロジェクトを発見したサイトである。これは、これは、CodeProjectのリンクであなた

How to put buttons inside a treeview 役立つことを願っていますプロジェクトには実際には作業中のプロジェクトに沿ったソースがあります。幸運

+1

+1その質問に答えてください、しかし、私は、記事のボタンtreeviewのスクリーンショットの奇妙さがさらに私自身のポイントを強化すると思います。 –

+0

ありがとう..そして私は同意します.. – MethodMan

2

これを行う最も簡単な方法は、自分でツリーを描くことです。ここで(PushButtonStateがSystem.Windows.Forms.VisualStyles名前空間内に位置していることに注意してください)小さな例です。

public class CustomTreeView : TreeView 
{ 
    private Rectangle buttonRect = new Rectangle(80, 2, 50, 26); 
    private StringFormat stringFormat; 

    public CustomTreeView() 
    { 
     SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 

     DrawMode = TreeViewDrawMode.OwnerDrawText; 
     ShowLines = false; 
     FullRowSelect = true; 
     ItemHeight = 30; 

     stringFormat = new StringFormat(); 
     stringFormat.Alignment = StringAlignment.Near; 
     stringFormat.LineAlignment = StringAlignment.Center; 
    } 

    protected override void OnDrawNode(DrawTreeNodeEventArgs e) 
    { 
     e.Graphics.DrawString(e.Node.Text, this.Font, new SolidBrush(this.ForeColor), e.Bounds, stringFormat); 
     ButtonRenderer.DrawButton(e.Graphics, new Rectangle(e.Node.Bounds.Location + new Size(buttonRect.Location), buttonRect.Size), "btn", this.Font, true, (e.Node.Tag != null) ? (PushButtonState)e.Node.Tag : PushButtonState.Normal); 
    } 

    protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) 
    { 
     if (e.Node.Tag != null && (PushButtonState)e.Node.Tag == PushButtonState.Pressed) 
     { 
      e.Node.Tag = PushButtonState.Normal; 
      MessageBox.Show(e.Node.Text + " clicked"); 
      // force redraw 
      e.Node.Text = e.Node.Text; 
     } 
    } 

    protected override void OnMouseDown(MouseEventArgs e) 
    { 
     TreeNode tnode = GetNodeAt(e.Location); 
     if (tnode == null) return; 

     Rectangle btnRectAbsolute = new Rectangle(tnode.Bounds.Location + new Size(buttonRect.Location), buttonRect.Size); 
     if (btnRectAbsolute.Contains(e.Location)) 
     { 
      tnode.Tag = PushButtonState.Pressed; 
      tnode.Text = tnode.Text; 
     } 
    } 
} 

また、あなたも、カスタムコントロールを作成せずにこれを達成することができます - ちょうど標準のツリービューにこれらのイベントハンドラを追加します

関連する問題