For Each Schleifen-Chaos

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    For Each Schleifen-Chaos

    Hallo liebe Community,

    seit Tagen sitze ich an einem Problem, für welches ich immer noch keine Lösung habe.
    Was ich haben will:
    - Für jeden Prozess als Combobox, in dessen nicht der Wert "Bitte Prozess angeben" gegeben ist, soll eine Tabelle in einer vorhandenen Datenbank erstellt werden. -> Tabelle erstellen -> funktioniert
    - Die Tabellennamen sollen aus den jeweiligen Textboxen Name1,Name2 etc. entnommen werden, dh. Name1.Text für Prozess1 -> funktioniert nicht!
    - In diese Tabelle werden Werte von einer anderen Datenbank hinzugefügt. -> Tabelle befüllen -> funktioniert
    - Die Daten der erstellten Tabelle sollen nun PRO TABELLE mit jeweiligen Bindingsources verknüpft werden, dh. Tabelle1 für Binding1, Tabelle2 für Binding2 etc.
    - Pro Tabelle soll ein Toolstripbutton für die nächste Form erstellt werden mit den jeweiligen Binding Sources als Datasource, sodass ich am Ende die Verknüpfung: Name1.Text für Prozess1 für Binding1, Name2.Text für Prozess2 für Binding2 etc. habe

    Die Idee dahinter ist simpel: Auf der nächsten Form existiert eine Toolstripleiste und eine versteckte Datagridview, welcher durch den Klick auf eines der Toolstripbuttons seine jeweilige Datasource mit den jeweiligen Bindings erhält. Sodass die jeweiligen Tabellen in der Datenbank durch die Toolstripbuttons erscheinen.



    VB.NET-Quellcode

    1. Dim Comboboxliste As New List(Of ComboBox)
    2. Dim Name As New List(Of TextBox)
    3. Dim n As Integer
    4. Comboboxliste.Add(Prozess1)
    5. Comboboxliste.Add(Prozess2)
    6. Comboboxliste.Add(Prozess3)
    7. Name.Add(Name1)
    8. Name.Add(Name2)
    9. Name.Add(Name3)
    10. For n = 0 To 2
    11. For Each Prozess As ComboBox In Comboboxliste
    12. If Prozess.Text <> "Bitte Prozess angeben" Then
    13. TabelleName = Name(n).Text
    14. 'Tabelle erstellen
    15. Tabelle.Name = TabelleName
    16. Tabelle.Columns.Append("Checkpunkte", ADOX.DataTypeEnum.adVarWChar,) '--> Hier taucht der Fehler "Exception from HRESULT: 0x80040E3E" auf
    17. Tabelle.Columns.Append("Ja", ADOX.DataTypeEnum.adBoolean,)
    18. Tabelle.Columns.Append("Nein", ADOX.DataTypeEnum.adBoolean,)
    19. Catalog.Tables.Append(Tabelle)
    20. 'Tabelle befüllen
    21. Prozessadapter.InsertCommand = New OleDb.OleDbCommand("INSERT INTO " & TabelleName & " (Checkpunkte) VALUES (@Checkpunkte)", ConnectionOLE2)
    22. Prozessadapter.InsertCommand.Parameters.Add("@Checkpunkte", OleDb.OleDbType.VarChar, 300, "Checkpunkte")
    23. Prozessadapter.AcceptChangesDuringFill = False
    24. Prozessadapter.Fill(Fragen)
    25. Prozessadapter.Update(Fragen)
    26. 'ToolstripButton erstellen
    27. ToolButton.Text = TabelleName '
    28. Fragebogen.FragenAllgemeinToolStrip.Items.Add(ToolButton)
    29. ToolButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
    30. ToolButton.ImageTransparentColor = System.Drawing.Color.Magenta
    31. ToolButton.Name = "Button"
    32. ToolButton.Size = New System.Drawing.Size(60, 29)
    33. 'Binding erstellen
    34. Tabellenadapter = New OleDb.OleDbDataAdapter("SELECT * FROM " & TabelleName & "", ConnectionOLE2)
    35. Tabellenadapter.Fill(DataGridSet)
    36. Binding.DataSource = DataGridSet
    37. AddHandler ToolButton.Click, AddressOf HandleDynamicButtonClick
    38. End If
    39. Next
    40. Next


    Wie man erkennen kann habe ich versucht, alle Combo und Textboxen jeweils in Listen zu packen und dann durch die Listen zu loopen. Es taucht der Fehler: Exception from HRESULT: 0x80040E3E auf, für die es keine wirkliche Beschreibung gibt. Ich hoffe ihr könnt mir da weiterhelfen!

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

    Ich kann dir sagen das der Fehler sagt das die ColumnID schon existiert.
    Column ID already exists or occurred more than once in the array of columns.
    Quelle: hresult.info/FACILITY_ITF/0x80040E3E
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Hallo zusammen,
    danke für die schnelle Antwort! Löst jedoch mein Problem nicht :(

    @EaranMaleasi
    Der Code soll für jede Combobox geloopt werden, dessen Wert nicht "Bitte Prozess angeben" vorweist. Heißt also, er soll für jede Combobox eine Tabelle erstellen.

    Das Problem ist aber, dass für jede Tabelle der passende Tabellenname hinzugefügt werden muss, welcher in Textboxen im Form beschrieben sind, also: für Prozess1(Combobox) wird eine Tabelle erstellt, mit dem Tabellennamen Name1(Textbox), und das muss auch in die Schleife, also Prozess1->Name1, Prozess2->Name2, Prozess3->Name3 etc. Ich hab den Anfangspost nochmal ergänzt
    Nur nochmal kurz, um die Antworten der beiden zusammenzufassen:
    In Zeile#20 legst Du für das Objekt Tabelle ein Column namens Checkpunkte an. Da Du aber in der Schleife nicht per New der Variable Tabelle ein neues Objekt zuweist, verwendest Du im 2 Schleifendurchgang dasselbe Tabellenobjekt. Da ist dann aber schon eine dementsprechend benannte Column namens Checkpunkte drin. Daher der Crash. Du musst noch davor schreiben, dass Tabelle nun eine neue Tabelle ist.
    Also effektiv müsstest Du in Z#16 schreiben: Tabelle = New WasAuchImmerTabellefürEinTypIst

    ##########

    Wenn Du in Z#15 If Prozess.Text = "Bitte Prozess angeben" Then Continue For schreibst, kannst Du die Verschachtelungstiefe um 1 senken.
    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.

    AndPod schrieb:

    Hast du deinen Code schon mal im Einzelschritt durchlaufen lassen um zu schauen ob er auch die richtigen Werte ermittelt? Den Fehlerhinweis, den meine Vorposter geschrieben haben deutet ja darauf hin, das eventuell in die falsche Tabelle geschrieben wird, welche bereits mit den Spalten existiert.


    Im Einzelschritt funktioniert es einwandfrei

    VB.NET-Quellcode

    1. If Prozess2.Text <> "Bitte Prozess angeben" Then
    2. 'Tabelle erstellen
    3. Tabelle2.Name = AG2.Text + Name2.Text
    4. Tabelle2.Columns.Append("Checkpunkte", ADOX.DataTypeEnum.adVarWChar,)
    5. Tabelle2.Columns.Append("Ja", ADOX.DataTypeEnum.adBoolean,)
    6. Tabelle2.Columns.Append("Nein", ADOX.DataTypeEnum.adBoolean,)
    7. 'Spalte Kommentar erstellen
    8. Catalog.Tables.Append(Tabelle2)
    9. TabelleName = AG2.Text + Name2.Text
    10. 'Tabelle befüllen
    11. Prozessadapter.InsertCommand = New OleDb.OleDbCommand("INSERT INTO " & TabelleName & " (Checkpunkte) VALUES (@Checkpunkte)", ConnectionOLE2)
    12. Prozessadapter.InsertCommand.Parameters.Add("@Checkpunkte", OleDb.OleDbType.VarChar, 300, "Checkpunkte")
    13. Prozessadapter.AcceptChangesDuringFill = False
    14. Prozessadapter.Fill(Fragen)
    15. Prozessadapter.Update(Fragen)
    16. 'Datagridview befüllen
    17. Tabellenadapter = New OleDb.OleDbDataAdapter("SELECT * FROM " & TabelleName & "", ConnectionOLE2)
    18. Tabellenadapter.Fill(DataGridSet)
    19. Fragebogen.DataGridView2.DataSource = DataGridSet.Tables(0)
    20. 'ToolstripButton erstellen
    21. ToolButton.Text = TabelleName '
    22. Fragebogen.FragenAllgemeinToolStrip.Items.Add(ToolButton)
    23. ToolButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
    24. ToolButton.ImageTransparentColor = System.Drawing.Color.Magenta
    25. ToolButton.Name = "Button"
    26. ToolButton.Size = New System.Drawing.Size(60, 29)
    27. AddHandler ToolButton.Click, AddressOf HandleDynamicButtonClick
    28. End If


    So sieht der Code dann ungefähr aus. Das soll jetzt für alle 31 Comboboxen durchgeführt werden
    Post#5 hast Du gelesen?
    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.

    VaporiZed schrieb:

    Nur nochmal kurz, um die Antworten der beiden zusammenzufassen:
    In Zeile#20 legst Du für das Objekt Tabelle ein Column namens Checkpunkte an. Da Du aber in der Schleife nicht per New der Variable Tabelle ein neues Objekt zuweist, verwendest Du im 2 Schleifendurchgang dasselbe Tabellenobjekt. Da ist dann aber schon eine dementsprechend benannte Column namens Checkpunkte drin. Daher der Crash. Du musst noch davor schreiben, dass Tabelle nun eine neue Tabelle ist.
    Also effektiv müsstest Du in Z#16 schreiben: Tabelle = New WasAuchImmerTabellefürEinTypIst

    ##########

    Wenn Du in Z#15 If Prozess.Text = "Bitte Prozess angeben" Then Continue For schreibst, kannst Du die Verschachtelungstiefe um 1 senken.


    Danke für die Antwort VaporiZed, gesagt getan, jetzt sagt er mir, dass die Tabelle bereits existiert mit dem Namen xy, der durchläuft die Liste an Namen nicht für jede Combobox, also die Verknüpfung Name1 ->Prozess1, Name2 ->Prozess funktioniert nicht

    Ich hatte versucht für n = 0 to 2 und TabelleName = Name(n).Text (siehe Anfangspost) die Combobox Prozess1 die Textbox Name1 zu verknüpfen
    An welcher Stelle? In Post#1 nimmst Du nur den TextBoxinhalt her, in P#7 den Text einer fixen TextBox und AG2, was immer das auch ist. Dazu ein Punkt für unser Verständnis: Schreib mal bitte ggf. dazu, was Name und AG und Co. ist. NameX sind TextBoxen, ProzessX ComboBoxen. AGx? Noch mehr CE-Bezeichnungen, die relevant sind?
    Haltepunkt an P#1, Z#19 und durchschauen, welchen Wert Tabelle.Name in dem Schleifendurchlauf hat.
    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.
    AG sind ebenfalls Textboxen, diese werden später auch noch in den Tabellennamen hinzugefügt, hab ich jetzt einfachheitshalber nicht gemacht. Sonst sind keine CE-Bezeichnungen vorhanden, die relevant sind. Hier die frischere Version:

    VB.NET-Quellcode

    1. Dim Comboboxliste As New List(Of ComboBox)
    2. Dim Name As New List(Of TextBox)
    3. Dim AG As New List(Of TextBox)
    4. Dim n As Integer
    5. Comboboxliste.Add(Prozess1)
    6. Comboboxliste.Add(Prozess2)
    7. Comboboxliste.Add(Prozess3)
    8. Name.Add(Name1)
    9. Name.Add(Name2)
    10. Name.Add(Name3)
    11. AG.Add(AG1)
    12. AG.Add(AG2)
    13. AG.Add(AG3)
    14. For n = 0 To 2
    15. For Each Prozess As ComboBox In Comboboxliste
    16. If Prozess.Text <> "Bitte Prozess angeben" Then Continue For
    17. Tabelle = New ADOX.Table
    18. TabelleName = AG(n).Text + Name(n).Text
    19. Tabelle.Name = TabelleName
    20. Tabelle.Columns.Append("Checkpunkte", ADOX.DataTypeEnum.adVarWChar,)
    21. Tabelle.Columns.Append("Ja", ADOX.DataTypeEnum.adBoolean,)
    22. Tabelle.Columns.Append("Nein", ADOX.DataTypeEnum.adBoolean,)
    23. Catalog.Tables.Append(Tabelle)
    24. 'Tabelle befüllen
    25. Prozessadapter.InsertCommand = New OleDb.OleDbCommand("INSERT INTO " & TabelleName & " (Checkpunkte) VALUES (@Checkpunkte)", ConnectionOLE2)
    26. Prozessadapter.InsertCommand.Parameters.Add("@Checkpunkte", OleDb.OleDbType.VarChar, 300, "Checkpunkte")
    27. Prozessadapter.AcceptChangesDuringFill = False
    28. Prozessadapter.Fill(Fragen)
    29. Prozessadapter.Update(Fragen)
    30. 'ToolstripButton erstellen
    31. ToolButton.Text = TabelleName '
    32. Fragebogen.FragenAllgemeinToolStrip.Items.Add(ToolButton)
    33. ToolButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text
    34. ToolButton.ImageTransparentColor = System.Drawing.Color.Magenta
    35. ToolButton.Name = "Button"
    36. ToolButton.Size = New System.Drawing.Size(60, 29)
    37. 'Binding erstellen
    38. Tabellenadapter = New OleDb.OleDbDataAdapter("SELECT * FROM " & TabelleName & "", ConnectionOLE2)
    39. Tabellenadapter.Fill(DataGridSet)
    40. Binding.DataSource = DataGridSet
    41. AddHandler ToolButton.Click, AddressOf HandleDynamicButtonClick
    42. Next
    43. Next


    Nun 2 Fälle, die auftauchen:

    Fall1: Nach etwas Rumspielen zeigt er mir nun keine Fehlermeldung an, wenn ich für alle Elemente in den Listen Comboboxliste, Name, AG Werte eingebe (also für alle Combo und Textboxen 0 bis 2). Dann erstellt er aber auch keine Tabellen ?(

    Fall2: Wenn ich nun nicht für alle Combo und Textboxen 0 bis 2 Werte eingebe, sondern nur bspw. nur von 0 bis 1, dann funktionierts, spuckt mir dann aber nach Erstellen der Tabellen folgenden Fehler in Zeile "Tabelle.Name = TabelleName" aus: " Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another."

    Vollzitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Thunderbolt“ ()

    Aber das haut doch wieder nicht hin. Hier mal Deine Kurzfassung

    VB.NET-Quellcode

    1. For n = 0 to 2
    2. For Each Prozess As ComboBox In Comboboxliste
    3. Tabelle.Name = AG(n).Text + Name(n).Text
    4. Next
    5. Next

    Sobald nur 2 ComboBoxen in der inneren Schleife auftauchen, bleibt bei denen n gleich. Und schwupps! Selber Name und Kollision.
    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.

    SerkanLives schrieb:

    - Für jeden Prozess als Combobox, in dessen nicht der Wert "Bitte Prozess angeben" gegeben ist, soll eine Tabelle in einer vorhandenen Datenbank erstellt werden. -> Tabelle erstellen -> funktioniert
    Dassis schlecht.
    Weil in Datenbanken soll man zur Laufzeit keine Tabellen erstellen, und das ist auch nicht nötig.
    Wenn man das Prinzip relationaler Datenbanken verstanden hat und richtig anwendet.
    Folglich empfehle ich dir, das relationale Konzept erstmal zu erlernen, bevor du weiter machst.
    Und dann das Datenmodell in der DB nach Stand der Technik strukturieren.

    Wirst sehen: Sehr sehr viele Dinge werden viel einfacher, wenn mans richtig anfasst.

    Als Tut kannste dieses Probieren: Grundlagen: Relationale Datenmodellierung