- PR -

TreeView で右クリックイベントの取得

投稿者投稿内容
NORIX
常連さん
会議室デビュー日: 2004/08/31
投稿数: 30
投稿日時: 2005-09-06 20:17
お世話になってます。
.net(C#)WinAPPで開発をしています。
TreeViewでノード上で右クリック時にコピー・削除のコンテキストメニューを表示したいのですが、ノード自体にイベントがないので不可能なのでしょうか。
ご存知の方教えてください。よろしくお願いいたします。
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2005-09-06 23:32
MouseDownイベントが用意されているはずです。
私のところでは、右クリック取れますけど?
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2005-09-06 23:32
イベントが無いということは無いと思いますが。。。
#確かに右クリックというイベントは無いですね。他のコントロールも。

ContextMenuプロパティにContextMenuオブジェクトを関連させる方法や
MouseDown,MouseUpイベントでContextMenu.Showメソッドを実行する方法があります。

右クリックしてもボタンを離したら元の選択ノードへ選択が戻るので
個人的には、MouseDownで押されたボタンと位置を記憶して
MouseUpで比較し一致したらContextMenuオブジェクトのShowメソッドを実行しています。
#一致したらというのはノードが一致したらという意味です。
NORIX
常連さん
会議室デビュー日: 2004/08/31
投稿数: 30
投稿日時: 2005-09-07 09:41
ありがとうございます。

TreeViewでのマウスイベントをひろって、そのときのクリック位置からノードが選択されたかどうか判別し、ノードがクリックされていたらコンテキストメニューを出す、ということですよね。

>MouseDownで押されたボタンと位置を記憶して MouseUpで比較し
ご指摘いただかなかったら確実にぬけてました。ありがとうございます。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-09-07 09:57
後から見る人のための補足ッス。( `・ω・)

引用:

NORIXさんの書き込み (2005-09-07 09:41) より:

そのときのクリック位置からノードが選択されたかどうか判別


これは、今回、イベント引数からは取れないっすよね?
GetNodeAt メソッドで取得できるんだったかな。
ついでに、SelectedNode が有効かどうかも見ておく必要があるのかな。



_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
まち
常連さん
会議室デビュー日: 2003/03/02
投稿数: 26
お住まい・勤務地: 東京都
投稿日時: 2006-03-20 16:59
連続で投稿してしまったため削除しましたorz

[ メッセージ編集済み 編集者: まち 編集日時 2006-03-20 17:08 ]
まち
常連さん
会議室デビュー日: 2003/03/02
投稿数: 26
お住まい・勤務地: 東京都
投稿日時: 2006-03-20 17:01
大分前の投稿なので書き込むか迷ったのですが。。。
Showで呼び出す場合、右クリックの時のみにコンテキストメニューを表示したいなら、
マウスダウンのときにマウスのどのボタンが押されたかを示す値を取得する必要があります。
private MouseButtons mouseButtons;

private void TreeView_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{

this.mouseButtons = e.Button;
}


[ メッセージ編集済み 編集者: まち 編集日時 2006-03-20 17:07 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-03-20 18:14
MouseDown 時に選択させた方が自然に見えるかも。

コード:

    private bool isMouseDown;

    private void treeView1_MouseDown(object sender, MouseEventArgs e) {
        this.treeView1.SelectedNode = this.treeView1.GetNodeAt(e.X, e.Y);

        if (e.Button == MouseButtons.Right) {
            this.isMouseDown = true;
            return;
        }

        this.isMouseDown = false;
    }

    private void treeView1_MouseUp(object sender, MouseEventArgs e) {
        if (! this.isMouseDown) {
            return;
        }

        if (this.treeView1.SelectedNode != null) {
            this.contextMenu1.Show(this, new System.Drawing.Point(e.X, e.Y));
        }

        this.isMouseDown = false;
    }


TextBox 何かを見ると自クライアント領域外で MouseUp しても表示されます。
中途半端に合わせてあるだけにちょっと微妙な動きになります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)