webentwicklung-frage-antwort-db.com.de

C # -Listenfensterelement Doppelklicken Sie auf Ereignis

Ich habe ein Listenfeld mit einigen Artikeln. Gibt es überhaupt einen Doppelklick-Event zu jedem Artikel?

Item 1
Item 2
Item 3

Wenn ich auf Element 2 doppelklicken würde, erscheint eine Messagebox mit der Aufschrift "Element 2"

Wie würde ich das machen?

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

Das sollte funktionieren ... check

100
Dark Knight

WinForms

Fügen Sie einen Event-Handler für das Control.DoubleClick -Ereignis für Ihre ListBox hinzu. In diesem Fall öffnet der Handler eine MessageBox, die das ausgewählte Element anzeigt.

Z.B.:

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

Dabei ist ListBox1 der Name Ihrer ListBox.

Beachten Sie, dass Sie den Ereignishandler folgendermaßen zuweisen:

ListBox1.DoubleClick += new EventHandler(ListBox1_DoubleClick);

WPF
Ziemlich das gleiche wie oben, aber Sie würden stattdessen das MouseDoubleClick-Ereignis verwenden:

ListBox1.MouseDoubleClick += new RoutedEventHandler(ListBox1_MouseDoubleClick);

Und der Eventhandler:

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

Bearbeiten: Sisyas Antwort prüft, ob der Doppelklick auf ein Element erfolgt ist, das in diesen Code eingefügt werden muss, um das in den Kommentaren erwähnte Problem zu beheben (MessageBox wird angezeigt, wenn ListBox während eines Elements doppelt geklickt wird ausgewählt ist, aber nicht auf ein Element geklickt wurde).

Hoffe das hilft!

28
Donut

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

Für alle, die eine WPF - Lösung suchen, ist hier ein guter Ansatz (über Oskars Antwort hier ):

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 führen Sie den VisualTree auf, bis Sie entweder ein übergeordnetes Element gefunden haben, bei dem es sich um ein ListBoxItem handelt, oder Sie sind auf die eigentliche ListBox aufgestiegen (und haben daher nicht auf ein ListBoxItem geklickt). 

13
msnider

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

dies sollte auch verhindern, dass das Ereignis ausgelöst wird, wenn Sie ein Element auswählen und dann auf einen leeren Bereich klicken.

8
Ulti

Es hängt davon ab, ob Sie ein ListBox-Objekt der Klasse System.Windows.Forms.ListBox Verwenden, das die ListBox.IndexFromPoint() -Methode hat. Wenn das ListBox-Objekt jedoch aus der Klasse System.Windows.Control.Listbox Stammt, funktioniert die Antwort von @ dark-knight (als richtige Antwort markiert) nicht.

Ich arbeite mit Win 10 (1903) und aktuellen Versionen von .NET Framework (4.8). Dieses Problem sollte jedoch nicht versionsabhängig sein, sondern nur, ob Ihre Anwendung WPF oder Windows Form für die Benutzeroberfläche verwendet. Siehe auch: WPF vs Windows Form

1
Tanque

Dies ist ein sehr alter Beitrag, aber wenn jemand auf ein ähnliches Problem gestoßen ist und eine schnelle Antwort benötigt:

  • Um zu erfassen, ob ein ListBox-Element angeklickt wird, verwenden Sie das MouseDown-Ereignis. 
  • Um zu erfassen, ob auf ein Element geklickt wird, und nicht auf ein Leerzeichen im Listenfeld, überprüfen Sie, ob listBox1.IndexFromPoint(new Point(e.X,e.Y))>=0
  • Um ein Doppelklick-Ereignis zu erfassen, prüfen Sie, ob e.Clicks == 2
0
Cenk

Ich zeige, dass Sie Visual Studio verwenden,

was Sie für die gleiche Ressource tun können, die Sie möchtenist in den ListBox-Eigenschaften -> Verhalten -> AutoPostBack auf "True" gesetzt.

Hoffe das wird helfen

0
user8077568