listView1->SelectedItems[0] Problem



  • Hallo !

    Ich möchte den ersten Wert aus einer ListView haben wenn ich die Zeile in der Listview anklicke.

    mein Aufbau sieht in Etwa so aus.

    # | Name | Wohnort ->Header bereich
    1 |Hans | Meier -> ListViewItem
    2 |Klaus | Müller -> ListViewItem

    int in;
    in = Convert::ToInt32(this->listView1->SelectedItems[0]->Text->ToString());
    // Ausgabe in Textfeld
    this->textbox1->Text = in.ToString();
    

    Wenn ich das erste mal in eine Zeile klicke zeigt er mir den Wert an. Wenn ich beim 2. mal klicke kommt diese Fehlermeldung.

    Eine nicht behandelte Ausnahme des Typs "System.ArgumentOutOfRangeException" ist in System.Windows.Forms.dll aufgetreten.

    Zusätzliche Informationen: InvalidArgument=Value mit dem Wert 0 ist für index ungültig.

    Ich benötige aber den ersten Wert um zum Beispiel genau diesen Datensatz zu löschen.



  • Da sollte es sowas wie SubItems[] geben. Versuch mal SelectedItems[0]->SubItems[0]



  • Benutzt du dort ein Inkrement??Ein ArgumentOutofRangeExeption deutet meistens darauf hin, das die Grenzen eines Arrays überschritten wurden.



  • t2b schrieb:

    Ein ArgumentOutofRangeExeption deutet meistens darauf hin, das die Grenzen eines Arrays überschritten wurden.

    Warscheinlich ist dieses Array = 0, also keine ListViewItems drinn, und wenn man wählt kommt eben diese Meldung. Prüfe erstmal ob der Count != 0 ist, oder zieh beim klicken ein ListviewItem aus der Liste und prüfe ob dieses != nullptr ist.
    Dann stürzt nix ab wenn nix drin ist. So mach ich es auch immer.



  • @t2b Nein eigentlich benutze ich kein Inkrement.
    @witte habs versucht und funzt leider auch nicht, kommt derselbe Fehler
    @denjo303 ListViewItems sind drin, habe zwar rausgefunden das es funzt wenn ich es mit try catch abfange, aber ist glaube auch nicht die Ideallösung. 😮

    also sozusagen
    [code]
    int in;
    try{
    in = Convert::ToInt32(this->listView1->SelectedItems[0]->Text->ToString());
    }
    catch(Exception ^e){

    }

    Aber es muss doch irgendwie gehen. Komischerweise habe ich es bei nem anderen Projekt auch so gemacht, also ohne es mit try catch abzufangen und da funzt es.
    mmh

    Na gut Danke erstmal. wenn ich den Fehler finde poste ich den 🙂



  • denjo303 schrieb:

    t2b schrieb:

    Ein ArgumentOutofRangeExeption deutet meistens darauf hin, das die Grenzen eines Arrays überschritten wurden.

    Warscheinlich ist dieses Array = 0, also keine ListViewItems drinn, und wenn man wählt kommt eben diese Meldung. Prüfe erstmal ob der Count != 0 ist, oder zieh beim klicken ein ListviewItem aus der Liste und prüfe ob dieses != nullptr ist.
    Dann stürzt nix ab wenn nix drin ist. So mach ich es auch immer.

    Bei einem leeren Array, dürfte dann aber keine OutofRange Exception kommen.
    Ich kann mir nur vorstellen, das es an dem ArrayIndex selber liegt. Es wird versucht, ein ArraySpeicher aufzurufen, den es garnicht gibt. Z.b. taucht diese Exception gerne bei Anfängern auf, die ein Array mit 5 Feldern deklarieren und dann versuchen dieses dann über Array[5] aufzurufen und dabei vergessen, das dabei der Index bei 0 anfängt. Dabei ist der Index 0,1,2,3,4. Also die 0 ist die erste Stelle und die 4 ist die fünfte Stelle

    @Fantoma555

    du hast geschrieben "Ich benötige aber den ersten Wert um zum Beispiel genau diesen Datensatz zu löschen."
    Was kann ich mir darunter genau vorstellen??
    Den Wert (bzw Zahl) des ArrayIndex? Oder den Wert des Arrays an der Indexstelle 0??



  • t2b schrieb:

    Bei einem leeren Array, dürfte dann aber keine OutofRange Exception kommen.

    natürlich, wenn gar kein element drin ist, ist auch der index 0 zuviel.



  • So würde ich das machen ... und so mache ich es auch bisher, allerdings in Verbindung mit dem SelectedIndexChanged-Event einer ListView.

    int in;
    if (this->listView1->SelectedItems->Count) {
       in = Convert::ToInt32(this->listView1->SelectedItems[0]->Text->ToString());
       // Ausgabe in Textfeld
       this->textbox1->Text = in.ToString();
    }
    

Anmelden zum Antworten