Listview Items dynamisch erzeugen
-
Guten Abend zusammen,
ich stehe momentan vor dem Problem bei einem ListView Element die Items dynamisch aus dem Inhalt einer Datenbank erzeugen zu lassen.
Aus einer mySQl Datenbank werden diverse Strings mittels dem mySQL .NET Connector ausgelesen,was soweit auch ohne Probleme funktioniert und in einem String array gespeichert.
Nun stehe ich vor dem Problem die listviewItems dynamisch mit dem ausgelesenen inhalt der DB zu erzeugen.
System::Windows::Forms::ListViewItem^ listViewItem1 = (gcnew System::Windows::Forms::ListViewItem(gcnew cli::array< System::String^ >(3) {L + sql[0] +, L + sql[1] +, L + sql[2] +}, -1));
Von der Theorie her hätte ich das Listviewitem mit dem oben genannten Code erzeugt(Nur ein Beispielcode),wobei sql[] das String Array mit dem Inhalt der DB ist.
Mein Problem ist ,dass ich leider nicht den Namen des Items festlegen kann.
Da für Jeden Datensatz ein eigenes item erzeugt werden muss,dachte ich mir,dass ich einfach eine for-Schleife laufen lasse,in der einfach die ID des Datensatzes an den Namen "listviewitem" dran gehängt wird.Leider ist dies Syntax technisch mittels
System::Windows::Forms::ListViewItem^ listViewItem + sql[X] = (gcnew System::Windows::Forms::ListViewItem......)
nicht möglich.
Hat jemand eine Idde oder einen anderen Ansatz wie dies zu realisieren wäre ?
Danke!
-
Ich verstehe dein Problem nicht.
System::Windows::Forms::ListViewItem^ listViewItem1 = gcnew System::Windows::Forms::ListViewItem("Daten für die erste Spalte (Name ?!)"); listViewItem1->SubItems->Add("Daten für die zweite Spalte"); listViewItem1->SubItems->Add("Daten für die dritte Spalte"); listView1->Items->Add(listViewItem1); // in den ListView einfügen
Was genau meinst du mit "ID an den Datensatz anhängen und inwiefern willst du den Namen setzen ?
Wenn es um die erste Spalte geht nimm doch einfachSystem::String^ ersteSpalte = StringErsteSpalte + StringIDErsteSpalte
usw.
-
Wenn Du die Daten schon in einem Array hast, schreib sie so in das ListView...
array<String^>^ _starry = gcnew array<String^>(20); for(int i=0; i<20; i++) { _starry[i] = String::Concat("Number ",i.ToString()); { for(int i=0; i<20; i++) { listView1->Items->Add(_starry[i]); }
Oder habe ich Dich falsch verstanden?
Gruß
Doug_HH
-
Vielen Dank für eure Antworten.
DarkShadow44 schrieb:
Ich verstehe dein Problem nicht.
System::Windows::Forms::ListViewItem^ listViewItem1 = gcnew System::Windows::Forms::ListViewItem("Daten für die erste Spalte (Name ?!)"); listViewItem1->SubItems->Add("Daten für die zweite Spalte"); listViewItem1->SubItems->Add("Daten für die dritte Spalte"); listView1->Items->Add(listViewItem1); // in den ListView einfügen
Was genau meinst du mit "ID an den Datensatz anhängen und inwiefern willst du den Namen setzen ?
Wenn es um die erste Spalte geht nimm doch einfachSystem::String^ ersteSpalte = StringErsteSpalte + StringIDErsteSpalte
usw.
Dieses vorgehen wäre doch für "1 zeile" Sprich 1 item. Wenn ich nun zb. 5 Datensätze aus der Datenbank bekomme,muss ich ja 5 Items erzeugen korrekt ?
Natürlich muss ich dann auch den namen der jeweiligen items anpassen.
Ansich hätte ich dies mit einem einfach aufzählen eines int wert gemacht.
Oder bin ich gedanklich komplett falsch ?DarkShadow44 schrieb:
Ich verstehe dein Problem nicht.
System::Windows::Forms::ListViewItem^ listViewItem1 = gcnew System::Windows::Forms::ListViewItem("Daten für die erste Spalte (Name ?!)"); listViewItem1->SubItems->Add("Daten für die zweite Spalte"); listViewItem1->SubItems->Add("Daten für die dritte Spalte"); listView1->Items->Add(listViewItem1); // in den ListView einfügen
Was genau meinst du mit "ID an den Datensatz anhängen und inwiefern willst du den Namen setzen ?
Wenn es um die erste Spalte geht nimm doch einfachSystem::String^ ersteSpalte = StringErsteSpalte + StringIDErsteSpalte
usw.
Dein Code wäre ja "nur" für eine Spalte,sprich 1 Datensatz.
Wie könnte ich dies aber für X Datensätze realisieren.Hierzu benötige ich ja je Datensatz 1 item Object.Vielen Dank!
-
Das musst Du wohl über eine Schleife machen.
-
Dein Code wäre ja "nur" für eine Spalte,sprich 1 Datensatz.
Wie könnte ich dies aber für X Datensätze realisieren.Hierzu benötige ich ja je Datensatz 1 item Object.Du meinst nur für eine Zeile ?
Für mehrere einfach eine Schleife. Das mit den SubItems ist dafür da, dass du einen Datensatz auf mehrere Spalten verteilen kannst wenn du willst. Das ListViewItem enthält den Text in Spalte 1, das erste SubItem den Text für Spalte 2 usw.
Das mit dem "Namen setzen" verstehe ich immer noch nicht. ListViewItems haben ansich keinen "Namen", nur einen Text. Und den kannst du ja dynamisch generieren, wenn du sie durchgezählt haben willst hängst du an den Text halt vorne noch die entsprechende Nummer dran.
-
DarkShadow44 schrieb:
Dein Code wäre ja "nur" für eine Spalte,sprich 1 Datensatz.
Wie könnte ich dies aber für X Datensätze realisieren.Hierzu benötige ich ja je Datensatz 1 item Object.Du meinst nur für eine Zeile ?
Für mehrere einfach eine Schleife. Das mit den SubItems ist dafür da, dass du einen Datensatz auf mehrere Spalten verteilen kannst wenn du willst. Das ListViewItem enthält den Text in Spalte 1, das erste SubItem den Text für Spalte 2 usw.
Das mit dem "Namen setzen" verstehe ich immer noch nicht. ListViewItems haben ansich keinen "Namen", nur einen Text. Und den kannst du ja dynamisch generieren, wenn du sie durchgezählt haben willst hängst du an den Text halt vorne noch die entsprechende Nummer dran.
Hallo,
dass mit den SubItems habe ich dank eurer Hilfe nun auch denke mal komplett Verstanden.
Das Objekt selber hat doch einen "Namen",den du auch beim erzeugen des Objekts mit angeben musst bsp. listviewitem1.Dieses wird ja später auch zum verwenden des Objekts benötigt.Soweit korrekt?
Von der Theorie her,hätte ich auch gesagt "machste einfach ne for-Schleife drum rum und lässt nen int-Wert hochzählen,der dann einfach hintendran gehängt wird".
Puste kuchen - Bei einer Objekt erzeugung gefällt dies VS leider nicht,auch wenn man diesen zuvor in einen String speichert(sonst wäre es ja auch so einfach^^).EDIT:
array<String ^> ^sql = Kernel->SQLMultipleRead("SELECT username FROM zd_user")->Split(','); for (int i = 0; i < sql->Length; i++) { System::Windows::Forms::ListViewItem^ listViewItem + sql[i] = gcnew System::Windows::Forms::ListViewItem("SAMPLE"); }
Speziell "listViewItem + sql[i]" diesen Teil mit der Kombinierung ist das Problem.Hier erwartet er ein Semicolon.(Der Code oben ist nur ein Beispiel und der Komplette Inhalt der Form Load Methode)
-
Hallo,
du musst nicht für jedes hinzuzufügende ListViewItem-Objekt einen neuen Namen erzeugen, es reicht so:
Vor der Schleife listViewItem definieren:
System::Windows::Forms::ListViewItem^ listViewItem;
in der Schleife nutzt du dann die aktuellen Daten für das listViewItem :
// in einer Schleife: listViewItem = gcnew System::Windows::Forms::ListViewItem("Daten für die erste Spalte (Name ?!)"); listViewItem->SubItems->Add("Daten für die zweite Spalte"); listViewItem->SubItems->Add("Daten für die dritte Spalte"); listView1->Items->Add(listViewItem); // in den ListView einfügen
MfG,
Probe-Nutzer
-
Probe-Nutzer schrieb:
Hallo,
du musst nicht für jedes hinzuzufügende ListViewItem-Objekt einen neuen Namen erzeugen, es reicht so:
Vor der Schleife listViewItem definieren:
System::Windows::Forms::ListViewItem^ listViewItem;
in der Schleife nutzt du dann die aktuellen Daten für das listViewItem :
// in einer Schleife: listViewItem = gcnew System::Windows::Forms::ListViewItem("Daten für die erste Spalte (Name ?!)"); listViewItem->SubItems->Add("Daten für die zweite Spalte"); listViewItem->SubItems->Add("Daten für die dritte Spalte"); listView1->Items->Add(listViewItem); // in den ListView einfügen
MfG,
Probe-Nutzer
Hallo Probe-Nutzer,
wenn ich das listview Steuerelemtn richtig verstanden habe,dann muss ich doch pro "zeile" ein listviewitem object erzeugen,oder ?
nachaktuellem Stand wäre dein Code ja eine Zeile mit 3 Spalten,richtig ?
-
Kann es sein dass du die Grundlagen noch nicht so ganz beherrscht ?
du musst zwischen dem Namen eines Objekts und dem namen einer Variable unterscheiden. Die Objekte selber haben keinen Namen, es ist hier nicht so wie im Designer dass jedes ListViewIem einen Namen hat falls du das meinst.
wenn ich das listview Steuerelemtn richtig verstanden habe,dann muss ich doch pro "zeile" ein listviewitem object erzeugen,oder ?
nachaktuellem Stand wäre dein Code ja eine Zeile mit 3 Spalten,richtig ?
genau.
Mit
System::Windows::Forms::ListViewItem^ listViewItem + sql[i] = gcnew System::Windows::Forms::ListViewItem("SAMPLE");
funktioniert das auch nicht. Versuchs mal mit
System::Windows::Forms::ListViewItem^ listViewItem = gcnew System::Windows::Forms::ListViewItem("SAMPLE" + sql[i]);
-
DarkShadow44 schrieb:
Kann es sein dass du die Grundlagen noch nicht so ganz beherrscht ?
du musst zwischen dem Namen eines Objekts und dem namen einer Variable unterscheiden. Die Objekte selber haben keinen Namen, es ist hier nicht so wie im Designer dass jedes ListViewIem einen Namen hat falls du das meinst.
wenn ich das listview Steuerelemtn richtig verstanden habe,dann muss ich doch pro "zeile" ein listviewitem object erzeugen,oder ?
nachaktuellem Stand wäre dein Code ja eine Zeile mit 3 Spalten,richtig ?
genau.
Mit
System::Windows::Forms::ListViewItem^ listViewItem + sql[i] = gcnew System::Windows::Forms::ListViewItem("SAMPLE");
funktioniert das auch nicht. Versuchs mal mit
System::Windows::Forms::ListViewItem^ listViewItem = gcnew System::Windows::Forms::ListViewItem("SAMPLE" + sql[i]);
Guten Abend,
mit dem "Namen" ansich ist es mir schon klar,ich habe in der Regel nur ein Problem mich verstandlich für andere in Schriftform auszudrücken..(wie ihr sicherlich schon mitbekommen habt).
Würde dein geposteter Vorschlag nicht die Erste Spalte mit "SAMPLE + sql[i]" füllen ? Bin momentan leider nicht in Reichweite meiner IDE.
-
Würde dein geposteter Vorschlag nicht die Erste Spalte mit "SAMPLE + sql[i]" füllen ?
Nein. Er würde den String "SAMPLE" mit dem i-ten String aus dem Array verknüpfen, der resultierende String wird dann in die erste Spalte gepackt.
-
DarkShadow44 schrieb:
Würde dein geposteter Vorschlag nicht die Erste Spalte mit "SAMPLE + sql[i]" füllen ?
Nein. Er würde den String "SAMPLE" mit dem i-ten String aus dem Array verknüpfen, der resultierende String wird dann in die erste Spalte gepackt.
ehm ja,das meinte ich.
Wie die Spalten gefüllt werden ist mir soweit ja auch klar.
Nur wie bekomme ich bei zb. 2 Datensätzen aus der DB (was 2 Zeilen in der Listview entspricht) in die Listview ?Nur darum geht es mir ansich.....
Sorry,wenn ich mich so undeuntlich ausdrücke.
-
Also dazu muss ich sagen dass ich keine Ahnung habe wie "SQLMultipleRead" die Daten zurück gibt. Ansich einfach so (Vorausgesetzt jeder String in "sql" ist eine Zeile):
for(int i=0;i<sql->Length;i++) { System::Windows::Forms::ListViewItem^ listViewItem1 = gcnew System::Windows::Forms::ListViewItem("ID: " + i); // ID in erster Spalte listViewItem1->SubItems->Add(sql[i]); // Datensatz in zweiter Spalte listView1->Items->Add(listViewItem1); // in den ListView einfügen }
Wenn in diesem Fall die Zeile auf mehrere Spalten aufgeteilt werden soll musst du sie halt noch splitten.
-
Hallo ^bnL,
bei deinen mangelnden Grundkenntnissen, beachte unbedingt Windows Forms und Visual C++ MACHT KEINEN SINN!.
Am besten, du beschäftigst dich ersteinmal mit den Grundkenntnissen einer Sprache (C++ oder C#) für Konsolenprogramme (bevor du GUI und Datenbanken verwendest)!