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.
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...
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.
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!