web-dev-qa-db-ja.com

C#リストボックスアイテムのダブルクリックイベント

いくつかのアイテムを含むリストボックスがあります。とにかく、各アイテムにダブルクリックイベントを添付できますか?

Item 1
Item 2
Item 3

アイテム2をダブルクリックすると、「アイテム2」というメッセージボックスが表示されます

どうすればいいですか?

48
Ozzy
void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
         int index = this.listBox1.IndexFromPoint(e.Location);
         if (index != System.Windows.Forms.ListBox.NoMatches)
            {
              MessageBox.Show(index.ToString());
            }
     }

これは動作するはずです...チェック

105
Dark Knight

WinForms

ListBoxの-​​ Control.DoubleClick イベントのイベントハンドラーを追加し、そのイベントハンドラーで選択されたアイテムを表示するMessageBoxを開きます。

例えば。:

 private void ListBox1_DoubleClick(object sender, EventArgs e)
 {
     if (ListBox1.SelectedItem != null)
     {
         MessageBox.Show(ListBox1.SelectedItem.ToString());
     }
 }

ListBox1は、ListBoxの名前です。

次のようにイベントハンドラを割り当てることに注意してください。

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);

[〜#〜] wpf [〜#〜]
上記とほとんど同じですが、代わりに MouseDoubleClick event を使用します。

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);

そして、イベントハンドラー:

 private void ListBox1_MouseDoubleClick(object sender, RoutedEventArgs e)
 {
     if (ListBox1.SelectedItem != null)
     {
         MessageBox.Show(ListBox1.SelectedItem.ToString());
     }
 }

編集: Sisya's answer アイテムでダブルクリックが発生したかどうかを確認します。これは、コメントに記載されている問題を修正するためにこのコードに組み込む必要があります(ListBoxをダブルクリックすると、MessageBoxが表示されますアイテムが選択されているが、アイテムをクリックしていない場合)。

お役に立てれば!

27
Donut

この質問はかなり古いものですが、この問題の解決策も探していました。受け入れられる解決策は、WinFormsであり、ここに来る多くの人が探しているWPFではありません。

[〜#〜] wpf [〜#〜]解決策を探している人のために、ここに素晴らしいアプローチがあります(Oskarの答え ここで ):

private void myListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    DependencyObject obj = (DependencyObject)e.OriginalSource;

    while (obj != null && obj != myListBox)
    {
        if (obj.GetType() == typeof(ListBoxItem))
        {
             // Do something
             break;
         }
         obj = VisualTreeHelper.GetParent(obj);
    }
}

基本的に、ListBoxItemである親アイテムが見つかるまで、または実際のListBoxに到達するまで(したがって、ListBoxItemをクリックしなかったまで)VisualTreeを上っていきます。

14
msnider

Winformsの場合

private void listBox1_DoubleClick(object sender, MouseEventArgs e)
    {
        int index = this.listBox1.IndexFromPoint(e.Location);
        if (index != System.Windows.Forms.ListBox.NoMatches)
        {
            MessageBox.Show(listBox1.SelectedItem.ToString());
        }
    }

そして

public Form()
{
    InitializeComponent();
    listBox1.MouseDoubleClick += new MouseEventHandler(listBox1_DoubleClick);
}

また、アイテムを選択して空白の領域をクリックすると、イベントの発生を防ぐ必要があります。

9
Ulti

ListBox.IndexFromPoint()メソッドを持つSystem.Windows.Forms.ListBoxクラスのListBoxオブジェクトかどうかによって異なります。しかし、ListBoxオブジェクトがSystem.Windows.Control.Listboxクラスからのものである場合、@ dark-knightからの回答(正解としてマークされている)は機能しません。

Win 10(1903)および.NET framework(4.8)の現在のバージョンを実行しています。ただし、アプリケーションがUIにWPFを使用しているかWindowsフォームを使用しているかにかかわらず、この問題はバージョンに依存するべきではありません。参照: WPF vs Windows Form

1
Tanque

これは非常に古い投稿ですが、誰かが同様の問題にぶつかり、迅速な回答が必要な場合:

  • ListBoxアイテムがクリックされたかどうかをキャプチャするには、MouseDownイベントを使用します。
  • リストボックスの空スペースではなくアイテムがクリックされたかどうかをキャプチャするには、listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
  • ダブルクリックイベントをキャプチャするには、e.Clicks == 2
0
Cenk