Tag zu ListViewItem hinzufügen

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von King2k7.

    Tag zu ListViewItem hinzufügen

    Hallo,
    ich komme zurzeit nicht weiter. Habe das Problem das ich leider nicht weiß/schaffe zu jedem Item in einem Listview einen Tag zu setzten.

    Ich versuche es gerade mit diesem Code:

    Quellcode

    1. int i = 0;
    2. while(xmlReader.Read())
    3. {
    4. if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "Movie")
    5. {
    6. string tmp = xmlReader.GetAttribute("Title");
    7. string tmp2 = xmlReader.GetAttribute("Year");
    8. string tmp3 = xmlReader.GetAttribute("imdbID");
    9. listView1.Items.Add(tmp);
    10. listView1.Tag = tmp3; // Habe gesehn das es falsch ist aber weiß leider nicht wie ich diese Zeile umschreiben muss damit jedes Item seinen eignen Tag bekommt
    11. listView1.Items[i].SubItems.Add(tmp2);
    12. ++i;
    13. }
    14. }

    Nach längerer suche im Netz bin ich leider immer noch nicht schlauer und würde mich über Tipps freuen.

    King2k7 schrieb:

    listView1.Items.Add(tmp);

    Die Add-Methode gibt dir direkt das hinzugefügte ListViewItem zurück, das dann auch die SubItems- und die Tag-Eigenschaft hat. Also sowas hier:

    C#-Quellcode

    1. var lvi = listView1.Items.Add(tmp);
    2. lvi.Tag = tmp3;
    3. lvi.SubItems.Add(tmp2);

    Dann kannste dein i direkt wieder wegwerfen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    King2k7 schrieb:

    Wieso kann ich den Tag nicht auslesen
    Tag ist ein object.

    C#-Quellcode

    1. string link = listView1.SelectedItems.Tag.ToString();
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    King2k7 schrieb:

    Wieso kann ich den Tag nicht auslesen
    Tag ist ein object.

    C#-Quellcode

    1. string link = listView1.SelectedItems.Tag.ToString();

    Sorry, aber auch mit deinem Code bekomme ich einen Fehler.

    ​Fehler 1 'System.Windows.Forms.ListView.SelectedListViewItemCollection' enthält keine Definition für 'Tag', und es konnte keine Erweiterungsmethode 'Tag' gefunden werden, die ein erstes Argument vom Typ 'System.Windows.Forms.ListView.SelectedListViewItemCollection' akzeptiert (Fehlt eine Using-Direktive oder ein Assemblyverweis?)


    Habe bisher aber auch noch immer nicht die Lösung gefunden.
    @King2k7 Sorry. :D

    C#-Quellcode

    1. string link = listView1.SelectedItems[0].Tag.ToString();
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    King2k7 schrieb:

    kommt als Fehler:null
    NULL selected Index oder NULL Tag zugewiesen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    {"InvalidArgument=Value mit dem Wert 0 ist für index ungültig.\r\nParametername: index"} System.Exception {System.ArgumentOutOfRangeException}

    @King2k7 Puhh :rolleyes: ..
    Und Du hast wirklich keinen Plan, was Dir diese sprechende, wirklich eindeutige Fehlermeldung sagen will?
    Schau doch mal genau hin und schalte ein wenig Logik ein..

    King2k7 schrieb:

    Haltet mich jetzt bitte nicht für dumm
    Das tut hier niemend.
    Poste doch einfach mal Dein komplettes Projekt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das ist der Teil wo die Items zum ListView hinzugefügt werden:

    C#-Quellcode

    1. ​if (typ == "4" || typ == "5")
    2. {
    3. var lvi = listView1.Items.Add(name + "[" + slots + "]");
    4. lvi.Tag = s;
    5. }
    6. else
    7. {
    8. var lvi = listView1.Items.Add(name);
    9. lvi.Tag = s;
    10. }


    Und hier versuche ich den Tag auszulesen:

    C#-Quellcode

    1. ​private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    2. {
    3. string link = listView1.SelectedItems[0].Tag.ToString();
    4. labelAttackView.Text = link;
    5. }

    King2k7 schrieb:

    hinzugefügt werden:
    Ändere mal die Reihenfolge:

    VB.NET-Quellcode

    1. Dim item = New ListViewItem()
    2. item.Name = "bla"
    3. item.Tag = "blabla"
    4. Me.ListView1.Items.Add(item)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Ändere mal die Reihenfolge:


    Habe es gemacht. So wird aber kein Name in die ListView eingetragen, habe die letzte Zeile von dir geändert.

    C#-Quellcode

    1. ​var item = new ListViewItem();
    2. item.Name = name + "[" + slots + "] (" + ergebniss[1] + "x)";
    3. item.Tag = ergebniss[0];
    4. this.listView1.Items.Add(item.Name);// Jetzt werden die namen eingetragen. Nur "Item" war die listview leer.

    King2k7 schrieb:

    string link = listView1.SelectedItems[0].Tag.ToString();

    So schwer...?

    Drösel es Punkt für Punkt auseinander:
    listView1 ist dein Control. Das hat eine Eigenschaft SelectedItems.
    Von welchem Typ ist diese Eigenschaft? Ohne jetzt nachzuschauen, vermutlich vom Typ (xxx)ItemCollection. Zugriffe auf Elemente dieser Collection dürfen über den Standard-Item-Index vorgenommen werden, also den Operator [], wobei der nullbasierte Index in die eckigen Klammern kommt. listView1.SelectedItems[0] liefert dir also das erste der "gerade markierten ListView-Items". Diese Liste kann aus einem Item oder aus mehreren Items bestehen - oder sie kann auch leer sein, vor allem und logischerweise dann, wenn gerade kein Eintrag markiert ist. Versucht man dann auf das Element mit Index 0 zuzugreifen, das es dann aber nicht gibt, hagelt es eine IndexOutOfRange-Exception.
    Also stelle vor dem Zugriff auf den Index sicher, dass er auch existiert, indem du z.B. vorher die Anzahl der Elemente in der Liste kontrollierst.

    Ach ja... und wenn schon der indizierte Zugriff nicht klappt, kann der Rest des Ausdrucks (...Tag.ToString()) natürlich erst gar nicht ausgeführt oder ausgewertet werden.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    King2k7 schrieb:

    Ich kann dazu nichts sagen weil ich einfach nicht verstehe wieso das so ist.
    zunächstmal sollteste das akzeptieren, mw. ohne es zu verstehen.
    Du kannst es im Debugger überprüfen, dass ListView1.SelectedItems.Count = 0 ist, also dass kein LVI selektiert ist. Wenn man das mal verstanden hat, dann ists auch kein Problem mehr, das abzufangen.

    Aber einfach ignorieren, weil mans nicht versteht... wie gesagt: so kommt man bestimmt nicht voran.