• ベストアンサー

リストボックスの選択項目をさらにクリック

こんにちは。 C#+.NetFramework3.5で開発しています。 リストボックスを使っているのですが、リストボックスの選択されている項目をさらにクリックした場合を検出したいのです。 イベントは、 Click MouseClick MouseDown を試してみましたが、どれも選択項目が変化したあとに呼び出されるため、目的を達することができません。 選択項目が変化する前に発生するイベントはないのでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

 こんばんは。  此れはリストボックスをサブクラス化して、WM_LBUTTONDOWNを引っ掛けるしか道はなさそうです。  其れにはNativeWindowクラスを継承して、WndProcメソッドをオーバーライドします。  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.nativewindow(VS.80).aspx  当方も初めて試したのですが、以下で目的は達成出来ると思います(二度目のクリック確認用にメッセージボックスを出していたのですが、WndProc内でモーダルすると、リストボックスのフォーカスがおかしくなるので省いています)。  参考程度になれば。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { ListBoxProc listBoxProc; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.listBoxProc = new ListBoxProc(this.listBox1); } } //サブクラス化用のクラス public class ListBoxProc : NativeWindow { const UInt32 WM_LBUTTONDOWN = 0x201; ListBox listBox; public ListBoxProc(ListBox listBox) { this.listBox = listBox; //ココでフックがかかる this.AssignHandle(this.listBox.Handle); } protected override void WndProc(ref Message m) { if (m.Msg == WM_LBUTTONDOWN) { UInt32 lParam = (UInt32)m.LParam; Point point = new Point(); point.X = (Int32)(lParam & 0xffff); point.Y = (Int32)(lParam >> 16); //マウス座標からアイテム番号へ変換 Int32 index = this.listBox.IndexFromPoint(point); //有効なアイテム番号だった if (index != -1) { //このアイテム番号は選択されている if (this.listBox.SelectedIndex == index) { //ココにくる } } } base.WndProc(ref m); } } }

titokani
質問者

お礼

なるほど、C#+.Netでのサブクラス化はこうするのですね。 試してみます。ありがとうございました。

関連するQ&A

  • accessでのリストボックス選択のイベント

    お世話になります。 度々で恐縮なのですが、以下の質問を よろしくお願いいたします。 accessのフォーム上にリストボックスとテキスト ボックスをはりつけ、リストボックスに表示されて いる行が選択されたら、その項目値をテキスト ボックスに表示させようとしています。 しかし、リストボックスのイベント(マウスボタン クリック時や開放時)を使ってみたのですが、 二度クリックしないとテキストボックスに表示され ません。 リストボックスの行が選択されたというイベントが あればいいのですが、見当たりません。 どうすれば、リストボックスで行が選択されたという イベントを捕まえることができるのかご教示お願い いたします。

  • リストボックスの項目削除

    すいません、以下の処理でこまっております。 ユーザフォームですがリストボックスで項目を指定して、ダブルクリックで削除をしたいのですがうまくできません。 <例> リストボックス a b c 1.aの項目をクリックして選択する。 2.ダブルクリックするとaのみ削除 ※aをただのクリックのみなら削除できるのですが選択してダブルクリックになるとできません。 まったくできません。 どなたかご教授をお願いします。 よろしくお願いします。

  • 選択項目移動処理(リストボックス)

    表題の件で、ご質問があります。 excel2003で、VBAのユーザフォームを使っております。 リストボックスが二つあり、左の項目を選択したら右の項目にその選択した値が移動する処理をしたいのですがまったくできません。 <処理内容> ・リストボックス1の内容 りんご text メロン トマト 上記で、りんごをダブルクリックするとリストボックス1とリストボックス2の内容は以下になります。 <選択後結果> ・リストボックス1 text メロン トマト ・リストボックス2 りんご このようにダブルクリックしたらりんごは消えてリストボックス2に移動します。 また逆の処理もしたくたとえばこの状態でリストボックス2を選択したらりんごがリストボックス1に戻る。 <処理内容> ・リストボックス2 りんご ・リストボックス1 text メロン トマト リストボックス2をダブルクリックすると以下のようになります。 ・リストボックス2 ・リストボックス1 りんご text メロン トマト このようになります。 上記二点の処理がしたいと思います。 どなた様か御教授頂けないでしょうか? お手数お掛けしますが宜しくお願いします。

  • リストボックスの選択項目をテキストボックスへ

    リストボックス1の選択項目7項目を左列のテキストボックス10個のうち7個に反映するコードがわかりません。どなたかご教授のほどよろしくお願いします。

  • リストボックス項目の変更

    javascript初心者です。 ラジオボタンを2つ、複数選択リストボックスが1つあります。どちらのラジオボタンをチェックしているかで、リストボックス内の項目を変化させたいと思っています。 これはjavascriptで実現可能でしょうか?参考になるサイトや方法を教えていただければ嬉しいです。

  • リストボックスで未選択の項目のvalue値を取得したい

    リストボックスで選択後送信ボタンにより送信された内容から、 未選択の項目のvalue値を取得したいのですが可能なのでしょうか? やりたいことは、送信したリストボックスに表示した全ての項目が知りたく、 さらにその選択状態を判定したいのです。 どうかお力添えを。

  • リストボックス項目の順番を入れ替える方法

    リストボックス内に10個ほどの項目があります。 ある項目を選択し、ボタンAをクリックすると、その項目が1つ上に移動し、 ボタンBをクリックすると、その項目が1つ下に移動するようにしたいのです。 ウグイス ホトトギス フラミンゴ ↓ フラミンゴを選択し、ボタンAをクリックします。 ↓ ウグイス フラミンゴ ホトトギス 使用ツールはVB.NET2003です。 テキストファイルから読み込んだデータをリストボックスに入れ、順序を入れ替えてから、上書き保存しようとしております。 何か良いアイディアありましたら、是非教えてください。 どうぞよろしくお願いします。

  • リストボックスについて。

    普通、リストボックスで項目を選択してからsubmitボタンで、情報を転送しますよね。そうではなくて、リストボックスを開いて、項目をクリックしたらデータの受け渡しをするようにしたい場合はどうすればいいでしょうか。そういうサイトを見たことがあったような気がしたので、もしあるのなら使いたいと思い、質問してみました。

    • ベストアンサー
    • HTML
  • Visual Basic 2008 のリストボックスで項目を選択した時にイベントを起こしたい。

    VisualBasic2008のリストボックスで、リストボックス内の項目をクリックした時にイベントを起こしたいのですが、 Private Sub の後に何と書いたらいいか分かりません。 どなたかご存知の方がいらっしゃったらご解答お願いします。 どのように使いたいかというと、例えばリストボックスは 1:リンゴ 2:みかん 3:すいか と入っていたとします。 その時に2行目の「2:みかん」の列をクリックしたとしたら、ちょっと文字列を操作(いらない部分を切ったり)してLabel2に「みかん」を表示、という感じに使いたいです。 違う列をクリックする度に再取得。 実行中に、削除ボタンを押してその列を削除したら(こちらのボタンは出来ています)、違う列を自分でクリックしない限りは何も取得しないのが望ましいです。

  • C#のリストボックスで、クリックしたヘッダーの項目についてソートをする

    C#のリストボックスで、クリックしたヘッダーの項目についてソートをするには、どうすればよろしいでしょうか? 現在左からファイル名、ファイルの場所、サイズというふうに項目のヘッダーが並んでいるのですが、どの項目のヘッダーをクリックしてもファイル名でソートされてしまいます。 わかる方、よろしくお願いいたします。

専門家に質問してみよう