C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: イベントをキャンセルしたい


(過去ログ 50 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■27505 / inTopicNo.1)  イベントをキャンセルしたい
  
□投稿者/ たこやき (33回)-(2008/11/08(Sat) 13:57:25)

分類:[.NET 全般] 

いつも助けられありがとうございます。
C#2008使用のド素人。

TreeViewのノードをダブルクリックした時、
自動的に開閉が行われるのですが、
それを取りやめて別の操作をさせたいのですが、わかりません。
ご指導下さい。
class myTreeView : TreeView
{
public myTreeView()
{
TreeNode tn1 = new TreeNode("aaa");
TreeNode tn2 = new TreeNode("bbb");
this.Nodes.Add(tn1);
this.Nodes[0].Nodes.Add(tn2);
}
protected override void OnMouseDoubleClick(MouseEventArgs e)
{
//base.OnMouseDoubleClick(e);
MessageBox.Show("開閉をキャンセルしたい");
}
}
引用返信 編集キー/
■27513 / inTopicNo.2)  Re[1]: イベントをキャンセルしたい
□投稿者/ やじゅ (769回)-(2008/11/08(Sat) 17:38:24)
やじゅ さんの Web サイト
No27505 (たこやき さん) に返信
> TreeViewのノードをダブルクリックした時、
> 自動的に開閉が行われるのですが、
> それを取りやめて別の操作をさせたいのですが、わかりません。

MSDNでどのイベントがあるか見ればいいのは?
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.treeview_events(VS.80).aspx

引用返信 編集キー/
■27514 / inTopicNo.3)  Re[2]: イベントをキャンセルしたい
□投稿者/ たこやき (34回)-(2008/11/08(Sat) 18:11:13)
やじゅさん、ご返信ありがとうございます。
ご指摘に適っているのかどうかわかりませんが、
以下の形で展開をキャンセルするようにしてみましたが、
イベントの発生順序が先なもので、失敗しました。
お手数をおかけしますが、どうかよろしくお願いします。
class myTreeView : TreeView
{
bool fg = false;
public myTreeView()
{
TreeNode tn1 = new TreeNode("aaa");
TreeNode tn2 = new TreeNode("bbb");
this.Nodes.Add(tn1);
this.Nodes[0].Nodes.Add(tn2);
}
protected override void OnMouseDoubleClick(MouseEventArgs e)
{
fg = true;
Console.WriteLine("OnMouseDoubleClick");
}
protected override void OnNodeMouseDoubleClick(TreeNodeMouseClickEventArgs e)
{
fg = true;
Console.WriteLine("OnNodeMouseDoubleClick");
}
protected override void OnBeforeExpand(TreeViewCancelEventArgs e)
{
if (fg) e.Cancel = true;
fg = false;
Console.WriteLine("OnBeforeExpand");
}
}

イベントの発生順序
OnBeforeExpand
OnNodeMouseDoubleClick
OnMouseDoubleClick



引用返信 編集キー/
■27516 / inTopicNo.4)  Re[3]: イベントをキャンセルしたい
□投稿者/ やじゅ (770回)-(2008/11/08(Sat) 19:36:22)
やじゅ さんの Web サイト
No27514 (たこやき さん) に返信
> 以下の形で展開をキャンセルするようにしてみましたが、
> イベントの発生順序が先なもので、失敗しました。

そこまで出来ているわけだから、分かりそうな気がしますけど。
キャンセルさせて何をしたいのかまでは分かりませんけど、
e.Cancel = true;をすれば展開はキャンセルされます。
その後に、実行したい処理を記述すればいいのはないですか?

if (fg) e.Cancel = true;

e.Cancel = true;
Console.WriteLine("実行したい処理を記述");

引用返信 編集キー/
■27537 / inTopicNo.5)  Re[4]: イベントをキャンセルしたい
□投稿者/ たこやき (35回)-(2008/11/09(Sun) 10:56:41)
やじゅさん ご返信ありがとうございます。
> e.Cancel = true;
このようにしちゃうと、展開そのものができなくなってしまうのですが……

行いたいことは、ダブルクリックをもってそのノードを展開させるのではなく、
ノードに関連付けられているデータを抽出して、DataGridViewに表示させようと
思っています。
よろしくお願いします。



引用返信 編集キー/
■27543 / inTopicNo.6)  Re[3]: イベントをキャンセルしたい
□投稿者/ よねKEN (18回)-(2008/11/09(Sun) 13:56:58)
> イベントの発生順序が先なもので、失敗しました。

確かにDoubleClick系のイベントより先にBeforeExpandイベントが発生するので、
既存のイベント使った判断ではうまく行きませんね。

他にも方法があるかもしれないので、ベストな方法かどうかはわかりませんが、
BeforeExpandイベントより先にDoubleClickを通知するイベントを用意することで一応実現できます。
以下のようにTreeViewの継承クラスを作り、WndProcをオーバーライドして自前でイベントを起こします。

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private bool isMouseDoubleClicked = false;
        private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e)
        {
            if (isMouseDoubleClicked)
            {
                isMouseDoubleClicked = false;
                e.Cancel = true;
            }
        }

        private void treeView1_DoubleClickBeforeExpand(object sender, EventArgs e)
        {
            isMouseDoubleClicked = true;
        }
    }

    public class TreeViewEx : TreeView
    {
        private const int WM_LBUTTONDBLCLK = 0x203;
        public event EventHandler DoubleClickBeforeExpand;

        protected override void WndProc(ref Message m)
        {
            switch(m.Msg)
            {
                case WM_LBUTTONDBLCLK:
                    if (this.DoubleClickBeforeExpand != null)
                        this.DoubleClickBeforeExpand(this, EventArgs.Empty);
                    break;
            }
            base.WndProc(ref m);
        }
    }
}

引用返信 編集キー/
■27545 / inTopicNo.7)  Re[5]: イベントをキャンセルしたい
□投稿者/ やじゅ (774回)-(2008/11/09(Sun) 14:56:45)
やじゅ さんの Web サイト
2008/11/09(Sun) 15:26:22 編集(投稿者)

No27537 (たこやき さん) に返信
> 行いたいことは、ダブルクリックをもってそのノードを展開させるのではなく、
> ノードに関連付けられているデータを抽出して、DataGridViewに表示させようと
> 思っています。
>

私の「展開しなくてもいい」という思い違いがありました、すみません。
方法としては、よねKENさんので問題ないと思います。

雑談:
クリックで展開、ダブルクリックで別処理を実現するそれ以外の方法だと、
クリックイベントとタイマーイベントを駆使しないと駄目かな。
ダブルクリックイベントでは、クリックイベントも動作してしまうので
タイマーイベントを使ってダブルクリックイベントより後にクリックイベント
で行う動作をタイマー内で動作させるなど しないと実現できないかと。


ダブルクリックした時のキーイベントの発生する順番
http://dobon.net/vb/dotnet/control/doubleclickevent.html

イベント順番
1.MouseDown
2.Click
3.MouseClick
4.MouseUp
5.MouseDown
6.DoubleClick
7.MouseDoubleClick
8.MouseUp
引用返信 編集キー/
■27546 / inTopicNo.8)  Re[4]: イベントをキャンセルしたい
□投稿者/ たこやき (36回)-(2008/11/09(Sun) 15:26:33)
よねKENさん、たいへん貴重な技術を授けていただき
ありがとうございます。
お陰でうまくいきました。
その上、ド素人では敷居の高かった自前のイベント作りも
学ぶことができて、これからのプログラミングが、
「ちょっと楽しみ!」って気分です。
とは言っても、プログラミングには相当苦しめられていますが……

ところで、ちょっと欲張った質問になりますが、
.NET用?のWindowsMessage(WM_LBUTTONDBLCLK = 0x203;)コードは
どのようにして学べばいいのでしょうか。
断片的な情報は得られるのですが、総合的な情報が得られなくって……
もしよろしかったらお教え下さい。
この度は本当にありがとうございました。
引用返信 編集キー/
■27547 / inTopicNo.9)  Re[5]: イベントをキャンセルしたい
□投稿者/ やじゅ (775回)-(2008/11/09(Sun) 15:35:46)
やじゅ さんの Web サイト
2008/11/09(Sun) 15:43:36 編集(投稿者)

No27546 (たこやき さん) に返信
> .NET用?のWindowsMessage(WM_LBUTTONDBLCLK = 0x203;)コードは
> どのようにして学べばいいのでしょうか。

ウィンドウと Window Control とメッセージの処理
http://www.asahi-net.or.jp/~ha3t-nkmr/vcl3-1.htm

ウィンドウメッセージ 一覧表示
http://www.winapi-database.com/Message/WM/

WindowsフォームでWindowsメッセージを直接処理するには?
http://www.atmarkit.co.jp/fdotnet/dotnettips/467wndproc/wndproc.html
引用返信 編集キー/
■27552 / inTopicNo.10)  Re[6]: イベントをキャンセルしたい
□投稿者/ たこやき (37回)-(2008/11/09(Sun) 17:25:25)
やじゅさん 貴重な情報提供、本当にありがとうございます。
かたじけなく、痛み入る思いです。
ありがとうございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -