2010-08-08 7 views
5

Ich versuche, etwas zu tun, wenn Doppel ein Element in einer List-Box klicken. Ich habe diesen Code dafür gefundenUmgang mit Doppelklick auf Ereignisse auf ListBox Elementen in C#

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()); 
      //do your stuff here 
     } 
    } 

Wenn ich jedoch auf ein Element klicke, wird das Ereignis nicht ausgelöst. Das Ereignis wird ausgelöst, wenn ich in die ListBox unter allen Elementen klicke.

Ich legte die DataSource-Eigenschaft der ListBox auf IList<MyObject>.

Irgendwelche Ideen?

+0

Die Idee zum Überprüfen von e.Clicks == 1 wurde bereits in diesem Thread erwähnt. Aber hier ist eine andere Zuschreibung auf diesen Ansatz: http://cf-bill.blogspot.com/2007/04/c-dragdrop-and-doubleclick.html –

Antwort

5

Versucht ein Formular mit einem List-Box mit MouseDown- und Double Ereignisse zu schaffen. Soweit ich sehen kann, ist die einzige Situation, wenn Doubleclick wird nicht ausgelöst ist, wenn im Inneren des MouseDown- Sie die MessageBox.Show (...) nennen. In anderen Fällen funktioniert es gut.

Und noch etwas, ich weiß nicht genau, ob es wichtig ist, aber trotzdem. Natürlich können Sie den Index des Elements wie diese:

int index = this.listBox1.IndexFromPoint(e.Location); 

Aber auf diese Weise ist auch in Ordnung:

if (listBox1.SelectedItem != null) 
    ... 
+0

Das ist, was ich in meinem MouseDown- tun: listBox.DoDragDrop (Element, DragDropEffects.Copy | DragDropEffects.Move); –

+0

@Hans Espen Ich sehe, es blockiert auch DoubleClick ... So können Sie es auf diese Weise tun: Innerhalb der MouseDown überprüfen Sie die Anzahl der Klicks (e.Clicks). Wenn e.Clicks gleich 1 ist, rufen Sie DoDragDrop auf, andernfalls führen Sie alle Aktionen für DoubleClick aus. – 26071986

+0

Ich habe Doppelklickereignis auf Listbox gehandhabt, aber ich kann nicht das Ereignis debuggen, sobald ich doppelklicke, VS wird abgestürzt, bevor ich das Ereignis betrete. Ich konnte nicht finden, was passiert. Bitte helfen Sie –

1

Works für mich, also gehe ich davon etwas über die Elemente in der Liste sein könnte (custom? Abfangen der Veranstaltung?) Oder das Ereignis nicht richtig verdrahtet.

Zum Beispiel versuchen, diese (komplett Form1.cs):

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 { 
    public class MyObject { 
     public MyObject(string someValue) { 
     SomeValue = someValue; 
     } 

     protected string SomeValue { get; set; } 

     public override string ToString() { 
     return SomeValue; 
     } 
    } 


    public partial class Form1 : Form { 
     public Form1() { 
     InitializeComponent(); 

     var list = new List<MyObject> { 
      new MyObject("Item one"), new MyObject("Item two") 
     }; 
     listBox1.DataSource = list; 

     } 

     private void listBox1_DoubleClick(object sender, EventArgs e) { 
     Debug.WriteLine("DoubleClick event fired on ListBox"); 
     } 
    } 
} 

Mit dem Designer-Quelldatei (Form1.Designer.cs) mit diesem:

private void InitializeComponent() { 
    this.listBox1 = new System.Windows.Forms.ListBox(); 
    ... // left out for brevity 
    this.listBox1.DoubleClick += new System.EventHandler(this.listBox1_DoubleClick); 

Als Test erstellen neue Forms-Basisanwendung über die Vorlagen, fügen Sie dann nur die ListBox hinzu und definieren Sie eine Klasse MyObject. Sehen Sie, ob Sie dasselbe oder ein anderes Verhalten beobachten.

0

John: dann funktioniert es. Aber ich habe herausgefunden, dass das Ereignis nicht ausgelöst wird, da ich auch das MouseDown-Ereignis behandle. Ich habe versucht, die MouseDown-Behandlung zu entfernen, und dann funktioniert es. Gibt es einen reibungslosen Weg, um beide Ereignisse zu behandeln? Wenn nicht, muss ich nur einen anderen Weg finden, um einen Doppelklick durch das MouseDown-Ereignis zu bekommen.

1

Sie für alle Antworten danken. Es funktioniert jetzt. Ich habe es gelöst, wie 26071986 sagte, mit der Behandlung Doppelklick in der MouseDown-Handler durch Überprüfen, ob e.Clicks ist 1. Wenn ja, ich DoDragDrop aufrufen, wenn nicht, ich rufe die Methode, die Doppelklick behandelt.

private void MouseDown_handler(object sender, MouseEventArgs e) 
    { 
     var listBox = (ListBox) sender; 

     if (e.Clicks != 1) 
     { 
      DoubleClick_handler(listBox1.SelectedItem); 
      return; 
     } 

     var pt = new Point(e.X, e.Y); 
     int index = listBox.IndexFromPoint(pt); 

     // Starts a drag-and-drop operation with that item. 
     if (index >= 0) 
     { 
      var item = (listBox.Items[index] as MyObject).CommaDelimitedString(); 
      listBox.DoDragDrop(item, DragDropEffects.Copy | DragDropEffects.Move); 
     } 
    } 
1

Hier ist, was ich im MouseDoubleClick-Ereignis verwendet habe.

private void YourMethodForDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     Type sourceType = e.OriginalSource.GetType(); 
     if (sourceType != typeof(System.Windows.Controls.TextBlock) 
      && sourceType != typeof(System.Windows.Controls.Border)) 
      return; 

     //if you get here, it's one of the list items. 

     DoStuff(); 
     ... 
    }