Laden...

Doppelklick auf Item in ListView soll Itembezogenes Ereignis auslösen

Erstellt von exaveal vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.180 Views
E
exaveal Themenstarter:in
96 Beiträge seit 2010
vor 13 Jahren
Doppelklick auf Item in ListView soll Itembezogenes Ereignis auslösen

Hallo Leute.

Ich verwende Windows Forms und habe eine ListView-Steuerelement. Es besitzt 4 Spalten, welche mit 4 Strings befüllt werden.


lstViewSearch.Items.Add(new ListViewItem("0", "Name0", "Vorname0", "Wohnort0", -1));
lstViewSearch.Items.Add(new ListViewItem("1", "Name1", "Vorname1", "Wohnort1", -1));
...

Nun möchte ich, dass bei einem Doppelklick auf eines der Items ein Ereignis ausgelöst wird, was sich aber speziel auf diesen Eintrag bezieht.

ListView hat zwar das Ereigniss Doppelklick:


        private void lstViewSearch_MouseDoubleClick(object sender, MouseEventArgs e)
        {

        }

Aber ich weiß ja nicht wo in der ListView hingeklickt worden ist. Natürlich kann ich noch das gerade ActivatedItem auslesen, aber dann würde ja auch das Szenario funtionieren:

Item1 auswählen, irgendwo anders in der LisView doppelklicken (zb auf eines der Spaltenbezeichnungen) und das Ereigniss würde auch mit dem aktiviertem item aufgerufen werden.

Gibt es da nicht eine schönere Lösung? Bin schon am msdn durchlesen, aber ich finde dazu leider nichts diskretes.

916 Beiträge seit 2008
vor 13 Jahren

Du kannst aus den mitgelieferten MouseEventArgs das Item berechnen. Ich glaub da gibt es eine Mehtode am ListView Control mit der du aus einem Point das Item extrahieren kannst.

Again what learned...

4.931 Beiträge seit 2008
vor 13 Jahren

Ja, die Methode heißt "HitTest" und dort übergibt man die relative Mausposition und erhält dann ein ListViewHitTestInfo-Objekt, das u.a. die Eigenschaften 'Item' und 'SubItem' besitzt.

Und die relative Mausposition erhält man mittels:


Point pt = listView.PointToClient(Control.MousePosition);

Edit: Ich habe gerade gesehen, daß du ja MouseDoubleClick benutzt und nicht das allgemeine DoubleClick-Ereignis. Dann hast ja mittels 'e.X' und 'e.Y' bzw. 'e.Location' schon die relativen Mauskoordinaten.

E
exaveal Themenstarter:in
96 Beiträge seit 2010
vor 13 Jahren

Super!

Mit euren Tipps und anschließendem Googeln bin ich zu folgendem funktionierendem Ergebnis gekommen:


        // Verweis auf das zu bearbeitende ListViewItem
        ListViewItem lstViewSearchItem = null;
        // Verweis auf das zu bearbeitende ListViewSubItem
        ListViewItem.ListViewSubItem lstViewSearchSubItem = null;


        private void lstViewSearch_MouseUp(object sender, MouseEventArgs e)
        {
            ListViewHitTestInfo htInfo = lstViewSearch.HitTest(e.X, e.Y);
            if (htInfo != null)
            {
                if (htInfo.Item != null && htInfo.SubItem != null)
                {
                    lstViewSearchItem = htInfo.Item;
                    lstViewSearchSubItem = htInfo.SubItem;
                }
            }
        }

Danke!