C# Listview Subitem hinzufügen (arrays)

  • C#

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von FormFollowsFunction.

    C# Listview Subitem hinzufügen (arrays)

    Moin,

    Ich möchte gerne 5 Arrays in einer Listview ausgeben (1Array pro Zeile

    Das heisst so kann diese Listview dann aussehen:

    HalloABCBlaBlubXYZ
    fdWernerabcHandBlubber
    abcbadffdsabcaber
    Klarso
    dfs

    Müller
    ab



    test



    wert
















    Die Anzahl Elemente pro Array wird von einer Externen Datei ausgelesen, ist also immer eine andere Anzahl und kann deshalb wie oben aussehen.

    Weiss jemand wie das geht ?(
    Grundkenntnis wie man eine Listview füllen kann mit Subitems habe ich... aber wie geht sowas?!
    Mh. irgendwie bleibe ich immer stehen sobald es mehrere Schleife gibt..

    Nun habe ich 1 Schleife (daten aus dem excel-dokument holen):

    C#-Quellcode

    1. for (int x = 1; x <= 1520; x += 4)
    2. {
    3. this.Hallo.Add(MySheet.Range["A" + x].Value); //ab in den Array
    4. tStrLabelGeladen.Text = x.ToString();
    5. }


    Nun will ich diesen Ausgeben:

    C#-Quellcode

    1. foreach (string a in Hallo)
    2. {
    3. LstItems.Items.Add(a);
    4. }


    Das funktioniert zwar, aber wie kann ich hier eine 2. Schleife machen, damit ich die Werte von dem 2. Array in die 2. Spalte kriege?!

    Wenn ich raus aus der Schleife gehe habe ich z.B. das Problem, dass das "x" nicht mehr weiss wohin es dazugehört... 8|

    Wenn ich das ganze mit 5 Listboxen mache kommt eine "System.NullReferenceException".
    Im Listview hast Du das Problem, dass Du, um Spalte 3 im DetailView zu erreichen, erstmal die Spalten 1 und 2 befüllen musst - und wenn auch nur mit Leertext. Dementsprechend müsstest Du bei Deinem Konstrukt erstmal rausfinden, wieviele Zeilen und Spalten Du hast, dann entsprechend viele Items (Zeilen) mit maximal vielen SubItems (Spalten) erzeugen/ins ListView reinschieben und dann alles mit den echten Daten befüllen. Ein guter Grund, auf Murdocs Rat zu hören und ein DGV zu verwenden. Die tabellarische Darstellung des ListViews wird viel zu oft (aber zum Glück immer weniger) verwendet/missbraucht, um das stellen-wir-mal-eine-Tabelle-dar-Ziel zu erreichen, welches mit einem für Tabellen geeignetes DGV viel besser erreicht werden kann.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Hallo,

    Merci für eure Hilfe!

    Es geht mir um das:
    viele Daten sind in einem Excel untereinander im Format:
    Data1
    Data2
    Data3
    Data1
    Data2
    Data3
    Data1
    Data2
    Data3
    Data1
    ...usw

    Ich möchte das diese Daten nun für einen MySql-Import so aussehen:

    Data1Data2Data3
    Data1Data2Data3
    Data1Data2Data3
    Data1Data2Data3
    Data1Data2Data3

    Weil dieses Format abweichungen im Excel haben kann, sehe ich das sofort in einer Listview, Listboxen, Datagridview oder was auch immer und kann es im Excel anpassen zum erneut einlesen, bis es passt.

    Sobald es passt speichere ich die Daten im Format Data1:Data2:Data3 in einem Textdokument, welches ich problemlos in eine .csv-Datei ändern kann (so einfach wie möglich, weil ich dieses Programm womöglich danach nie mehr benötigen werde).

    Wie kann ich sowas machen in einem Datagridview? Dort habe ich ja wieder das gleiche Problem mit den Schleifen?

    Habe gestern Stunden damit verbracht.

    Gruss Newsletter
    Jetzt wird's verwirrend. Was steht in Excel, was soll in Deinem Programm stehen und wie willst Du es am Ende an Deine MySQL-DB weitergeben? In Post#1 sagst Du: Unterschiedliche Zeilenzahl pro Array. In Post#5 kommt: Es gibt eine Spalte in Excel und gleichmäßig viele Zeilen und Spalten in Deinem Programm. Kannst Du mal bitte eine Test-Exceldatei posten, die eine valide Datenaufstellung wiedergibt, dazu ein Bild, wie es in Deinem Programm aussehen soll und ggf. noch, wie was zur DB verschoben werden soll. Die ganzen Umschreibungen führen eher zur Verwirrung als zu Klarheit. Zumindest für mich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @newsletter Wenn Du eine ordentliche Excel-Liste hast, kannst Du die direkt in eine DataTable einlesen und diese als DataSource an Dein DataGridView binden.
    Da gibt es beliebig viele Vorlagen im Web.
    social.msdn.microsoft.com/Foru…esen?forum=visualcsharpde
    social.msdn.microsoft.com/Foru…ual-basic?forum=vbgeneral
    mycsharp.de/wbb2/thread.php?postid=234604
    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!
    Ich erkläre es nochmal sorry - ich glaube ihr denkt zuweit... ;)

    Ich habe 52 solche Listen:


    Leider sind die Listen teilweise nicht genau nach diesem Schema, aber meistens schon

    Deshalb muss ich diese Fehler finden um sie zu löschen respektive zu korrigieren.
    (Data1 etc sind nur Beispielbezeichnungen es sind unterschiedliche Wörter also z.B. so:


    Die listen haben eine unterschiedliche Länge (einmal gehen sie 5000 nach unten und einmal nur 800)
    Jede dieser Listen soll danach so aussehen:


    Wie ich das mache ob mit VBA direkt in Excel, in C# in eine Listview, Datagridview oder Listbox lade und danach in ein Textdokument speichere "Data1:Data2:Data3:Data4:Data5" um sie danach in ein Excel zu importieren spielt keine Rolle...

    Hoffe ihr versteht mich nun :)
    @newsletter Ich denke mal laut:
    Du hast eine Liste mit Strings, die Items zu Personen repräsentieren.
    Die Anzahl der Items pro Person ist unterschiedlich.
    Wäre die Anzahl der Items pro Person überall gleich, würdest Du etwa wie folgt durch die Liste iterieren:

    VB.NET-Quellcode

    1. For i = 0 To lst.Count - 1 Step 5
    2. Dim columns = New List(Of String)
    3. For j = 0 To 4
    4. columns.Add(lst(i + j))
    5. Next
    6. ' mit columns was tun
    7. Next
    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!
    genau, weil es nicht überall gleich ist lösche ich dann einfach diese Spalten raus, welche zuviel sind. Diese Fleissarbeit bleibt mir so oder so nicht erspart, weil mir dafür den Anhaltspunkt fehlt ;) Es ist aber zu 90% korrekt (5Tief = 1 Person).

    Unnötiges Vollzitat entfernt. Editiert. ~fufu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fufu“ ()

    @newsletter Das Problem dürfte sein, die fehlenden Einträge richtig zu identifizieren, aber dazu müsstest Du uns erst mal die Logik dahinter erklären.
    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!
    Ich denke eben mit einer Listview, Gridview oder 5 Listboxen kann ich das ganze gut identifizieren.

    z.B. Liste mit 302Zeilen : 5 (Spalten) = 60,4 Zeilen innerhalb des Steuerelements (Listview, Gridview oder pro Listbox).
    Weil die Einträge unterschiedlich sind sehe ich wo die Abweichungen sind.

    Ich müsste also sowas wie

    C#-Quellcode

    1. for (int x = 1; x <= 1520; x += 4)
    2. {
    3. this.Hallo.Add(MySheet.Range["A" + x].Value); //ab in den Array
    4. tStrLabelGeladen.Text = x.ToString();
    5. }


    = Data1 soll immer in Spalte 1 gehen. Und Data2 in Spalte 2 usw..
    machen.

    Aber das weiss ich noch nicht wie weil es dafür verschachtelte Schleifen braucht :huh:
    Also ganz Simpel.

    Sehe ich hier eine Abweichung beispielsweise Data2 ist in Spalte 3, lösche ich den Fehler an diesem Punkt im Excel und lese es neu ein bis alles stimmt :)


    Unnötiges Vollzitat entfernt. Editiert. ~fufu

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „fufu“ ()

    Nehmen wir mal Dein gelb-orange-grün-Bild aus Post#8 her: Woher soll der Computer wissen, wo ein neuer Datensatz losgeht? Für ihn ist da durchgängig in jeder Zeile irgendein Text. Dass der Datensatz mit einem Personennamen losgeht, darf nur dann ein Kriterium sein, wenn Du eine Liste von Namen hast, die da kommen dürfen. Ansonsten ist es weder für einen PC noch für uns als Programmierer möglich, den Anfang eines Datensatzes zu erkennen. Mit menschlichem Vorwissen, was ein Personenname ist und was nicht, darf/kann man da nicht arbeiten, aber ich hoffe, dass Dir das klar ist. Oder sind die Datensatzanfänge noch irgendwie anders markiert, außer durch den logischen Inhalt? Z.B. farbliche Markierung, Sonderzeichen, Leerzeilen o.ä.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Du brauchst mindestens eine eindeutige Regel, um wenigstens einigermaßen Ausreißer programmatisch zu erkennen.
    Das könnte z.B. sein, dass Feld 4 immer "test" enthalten muss.
    Oder Feld 5 numerisch sein muss.
    Oder die Kombination Feld1/Feld2 in einer Mitarbeiterliste erscheinen muss.
    Damit hast du eine gute Chance, solche fehlerhaften Records zu erkennen.
    Ohne Regeln hast du keine Chance der automatischen Erkennung.

    Wie kommen die Fehler überhaupt da rein?
    Kann man das nicht schon bei der Eingabe abfedern?

    Die Datenbereinigung würde ich aber in einem Vorlauf in Excel regeln und erst dann, wenn die Daten geprüft sind, dem Programm füttern.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Also ich bin mal soweit:

    C#-Quellcode

    1. for (int x = 1; x <= 301; x++)
    2. {
    3. this.Liste.Add(MySheet.Range["A" + x].Value); //Lade Daten in den Array "Liste"
    4. tStrLabelGeladen.Text = x.ToString();
    5. }

    Das Excel hat 300 Zeilen (also 301 wenn es bei 1 anfängt zu zählen)

    C#-Quellcode

    1. for (int b = 0; b <= 299; b += 5)
    2. {
    3. tStrLabelDGVItems.Text = DGVListe.Rows.Count.ToString();
    4. DGVListe.Rows.Add(Liste[b].ToString());
    5. }

    Ladet die "Personen" korrekt in die erste Spalte (problem habe ich hierbei das es keine System.NullReferenceException gibt, aus diesem Grund habe ich 299 eingegeben: Array 0 + 299 = 300 = 300 ist durch 5 Teilbar = 60 Datensätze ...
    er sollte einfach soweit hinzufügen wie es geht

    Hier bin ich auf die Idee gekommen, dass ein "integer" immer ganze Zahlen ausgibt... also sowas wie

    C#-Quellcode

    1. int laenge = (301 / 5 * 5) - 1;
    2. for (int b = 0; b <= laenge; b += 5)
    3. {
    4. DGVListe.Rows.Add(Liste[b].ToString();
    5. tStrLabelDGVItems.Text = DGVListe.Rows.Count.ToString();
    6. }


    Damit aber auch die anderen Spalten befüllt werden braucht es weitere "for-Schleifen" z.B. so in etwa:

    C#-Quellcode

    1. int laenge = (301 / 5 * 5) - 1;
    2. for (int b = 0; b <= laenge; b += 5)
    3. {
    4. tStrLabelDGVItems.Text = DGVListe.Rows.Count.ToString();
    5. for (int c = 1; c <= 300; c += 5)
    6. {
    7. DGVListe.Rows.Add(Liste[b].ToString(), Liste[c].ToString());
    8. }
    9. }

    was allerdings natürlich nicht funktioniert...

    Ich will einfach mal das der Array so in das Gridview geht:
    Liste[0].ToString() gehe-->Spalte1 vom Gridview
    Liste[1].ToString() gehe-->Spalte2 vom Gridview
    Liste[2].ToString() gehe-->Spalte3 vom Gridview
    Liste[3].ToString() gehe-->Spalte4 vom Gridview
    Liste[4].ToString() gehe-->Spalte5 vom Gridview

    Liste[5].ToString() gehe-->Spalte1 vom Gridview
    Liste[6].ToString() gehe-->Spalte2 vom Gridview
    Liste[7].ToString() gehe-->Spalte3 vom Gridview
    Liste[8].ToString() gehe-->Spalte4 vom Gridview
    Liste[9].ToString() gehe-->Spalte5 vom Gridview

    Liste[10].ToString() gehe-->Spalte1 vom Gridview
    Liste[11].ToString() gehe-->Spalte2 vom Gridview

    usw. bis es nicht mehr möglich ist (egal wielange der Array ist, die anderen Excel-Listen, welche ich in den Array fülle sind nicht nur 300Zeilen lang.

    aber wie kann ich sowas machen? :S


    EDIT:\\
    So siehts schonmal super aus, aber wie verhindere ich die System.NullReference-Exception?

    C#-Quellcode

    1. int laenge = (301 / 5 * 5) - 1;
    2. for (int b = 0; b <= laenge; b += 5)
    3. {
    4. tStrLabelDGVItems.Text = DGVListe.Rows.Count.ToString();
    5. DGVListe.Rows.Add(Liste[b], Liste[b + 1], Liste[b + 2], Liste[b + 3], Liste[b + 4]);
    6. }


    *Bitte kein reines Rot im Text vewenden (siehe Regeln), wurde geändert*

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Marcus Gräfe“ ()

    newsletter schrieb:

    So siehts schonmal super aus, aber wie verhindere ich die System.NullReference-Exception?
    (OT: In meiner Welt kann eine NullReference-Exception nicht 'schonmal gut aussehen')
    Finde heraus, welches Objekt null ist, was es nicht dürfte.
    Ich bezweifel aber bischen, dass es eine NullReference-Exception ist, aber sag die genaue Zeile, und gib den Wortlaut der Exception wieder.
    Nur so am Rande: Du redest immer wieder von Arrays, verwendest aber Listen.
    Das kann schnell zu Missverständnissen führen,
    Präzision beim beschreiben von Problematiken, kann nicht schaden ! :rolleyes: