2010-12-15 11 views
40

Ich habe ein Listenfeld mit einigen Elementen. Kann ich an jedem Gegenstand ein Doppelklickereignis anbringen?C# Listenfeld Element Doppelklick Ereignis

Item 1 
Item 2 
Item 3 

Wenn ich Artikel zu verdoppeln war klicken 2, ein Messagebox sagen: "Artikel 2" würde

Pop-up Wie würde ich das tun?

Antwort

87
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()); 
      } 
    } 

Dies sollte funktionieren ... überprüfen

+5

'e.Location'!?!?!? Sind Sie sicher, gibt es diese Methode? Visual Studio schlug mir diese Methode nicht durch Strg + Leerzeichen! –

+7

@Milas: Ich war durch das gleiche Problem ratlos. Stellen Sie sicher, dass Sie das MouseDoubleClick-Ereignis (und daher MouseEventArgs) und NICHT DoubleClick (das nur EventArgs enthält) verwenden. – winwaed

+0

Warum nicht lieber 'SelectedItem' verwenden? – Jack

25

WinForms

einen Event-Handler für das Control.DoubleClick Event für Ihre ListBox, und in diesem Ereignishandler hinzufügen MessageBox Anzeige des ausgewählten Elements öffnen.

Z. B .:

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

Wo ListBox1 der Name Ihres ListBox ist.

Beachten Sie, dass Sie den Event-Handler wie folgt zuordnen würde:

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick); 

WPF
ziemlich das gleiche wie oben, aber Sie würden die MouseDoubleClick event statt:

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick); 

Und der Event-Handler:

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

Edit: Sisya's answer überprüft, ob der Doppelklick auf ein Element aufgetreten, die in diesen Code eingebaut werden müßte, die Frage in den Kommentaren erwähnt zu beheben (MessageBox angezeigt, wenn ListBox doppelgeklickt während ein Artikel ausgewählt ist, aber nicht auf einen Artikel geklickt wurde).

Hoffe, das hilft!

+6

Heyy helfen, ich habe gerade versucht und es funktioniert ... aber wenn ich eine itm wählen dann einen leeren Teil des Listenfeld Doppelklick auf das Ereignis ausgelöst wird nach wie vor und zeigt das Meldungsfeld weil der artikel immer noch ausgewählt ist, obwohl ich nicht doppelt drauf geklickt habe ... irgendwelche ideen? :/ – Ozzy

+0

Ich habe das versucht und musste neue MouseButtonEventHandler (ListBox1_NouseDoubleClick); für es auf WPF arbeiten. – Jiminion

6

für 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()); 
     } 
    } 

und

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

, die auch sollten, verhindern für die Veranstaltung Brennen, wenn Sie ein Element auswählen, dann Klicken Sie auf einen leeren Bereich.

12

Ich weiß, dass diese Frage ziemlich alt ist, aber ich suchte nach einer Lösung für dieses Problem auch. Die akzeptierte Lösung ist für WinForms nicht WPF, die ich denke, dass viele, die hierher kommen, suchen.

Für alle, die eine WPF Lösung suchen, hier ist ein großer Ansatz (über Oskar Antwort here):

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); 
    } 
} 

Grundsätzlich Sie die VisualTree gehen, bis Sie haben entweder ein übergeordnetes Element gefunden, dass ist ein ListBoxItem, oder Sie steigen bis zur tatsächlichen ListBox auf (und klickten daher nicht auf ein ListBoxItem).

+0

funktioniert nicht in *** NET 4.5 *** –

0

zeige ich Ihnen, Visual Studio verwenden,

, was Sie für die gleiche resualt tun können, die Sie wollen in der List-Box Properties- ist> Verhaltens-> Autopostback ändern Sie ihn auf „True“.

Hoffnung, dass