Announcement

Collapse
No announcement yet.

ListView und Kontexmenü

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ListView und Kontexmenü

    Servus allerseits! <br>

    Ich habe ein kleines Problem:
    Ich habe ein Listview, dem, sofern er Elemente enthält ein Kontextmenü zugeordnet wird.
    Der Gag soll aber sein, das wenn man im ListView (ist im Modus der Detailansicht) in den leeren Bereich klickt, ein Großteil der Menüoptionen deaktiviert sein soll.
    Nur wenn man auf einen der Einträge, also auf eines der ListViews Items klickt, dann sollen alle Einträge des Menps wählbar sein.

    So, das Knotextmneü zuordnen ist ja kein Problem.
    Wenn nich nun das MouseDown Event abfange und mir vom Sender, dem Listview, das aktuell selektierte Element (ListView.SelectedItems[0]) = geben lasse, bekomme ich aber immer das letze.
    Als würde es erst NACH dem Rechtsklick selektiert, und nicht wie beim Linksklick sofort.
    So sieht der Code aus:

    Code:

    private void lstVw_Designs_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
    string test = "";
    if (e.Button == MouseButtons.Right)
    {
    if (this.lstVw_Designs.SelectedItems.Count > 0)
    {
    test =this.lstVw_Designs.SelectedItems[0].Text;
    MessageBox.Show(test);
    }
    if (this.lstVw_Designs.SelectedItems.Count > 0)
    {
    test = (sender as ListView).SelectedItems[0].Text;
    MessageBox.Show(test);
    }
    }
    }

    Hierbei ist es egal welche der beiden if-Anweisungen man nimmt, beide liefern das gleiche. Nicht das aktuelle selektierte, sondern das vorherige (bei der ersten Auswahl also keines.)

    Ist die einzige Möglichkeit das aktuell selektierte zu bekommen, das ich mir die Pixelkoordinaten geben lasse und berechne in welchem Element ich bin?

  • #2
    Hallo!
    Du solltest das ganze nicht bei Maus-Down, sondern bei Mause-Up behandeln. Ein Kontextmenu erscheint erst, wenn die taste wieder losgelassen wird.
    Dann solltest Du Dir die Typumwandlung sparen. Auf das Listview kann man ja auch ohne diese Umwandlung zugreifen.
    Ob in einen leeren raum geklickt wurde, erkennt man z.B. so:

    ListViewItem ClickItem ListView.GetItemAt(e.X,e.Y);
    Wenn ClickItem null ist, dann wurde in leeren Raum geklickt.

    Ausserdem sollte man nicht vergessen, das der Benutzer auch die Tastatur verwenden kann, um ein Kontextmenu aufzurufen (Taste zwischen Alt Gr und Strg).

    Gruss
    Bod

    Comment


    • #3
      stimmt die Taste hatte ich vergessen . Muss also auch noch rein, aber da spare ich mir da die Abfrage och ich ins Nix gegklickt habe.
      Ansonten mache ich es mittlerweile schon mit MouseUp + GetItemAt.
      Trotzdem Vielen Dank für deine Hilfe (und den Tipp

      Comment

      Working...
      X