Form2 lasst keine Verbindung zu Datenbank zu

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

Es gibt 48 Antworten in diesem Thema. Der letzte Beitrag () ist von Akanel.

    sieht ich finde nicht so schlecht aus - also viel Databinding-Kram sinnvoll und funktional verbaut :thumbsup:
    Nur sowas ist natürlich eine ständige Selbst-Wiederholung - das kann man bestimmt auch iwie zusammenfassen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ArtikelBearbeiten()
    2. Dim frmArtikel = dlgArtikel
    3. frmArtikel.ArtikelBindingSource.DataSource = ArtikelBindingSource.Current
    4. If frmArtikel.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    5. frmArtikel.ArtikelBindingSource.EndEdit()
    6. frmArtikel.ArtikelBindingSource.RemoveCurrent()
    7. Else
    8. frmArtikel.ArtikelBindingSource.CancelEdit()
    9. End If
    10. End Sub
    11. Private Sub RechnungBearbeiten()
    12. Dim frmRechnung = dlgRechnung
    13. frmRechnung.RechnungBindingSource.DataSource = RechnungBindingSource.Current
    14. If frmRechnung.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    15. frmRechnung.RechnungBindingSource.EndEdit()
    16. frmRechnung.RechnungBindingSource.RemoveCurrent()
    17. Else
    18. frmRechnung.RechnungBindingSource.CancelEdit()
    19. End If
    20. End Sub
    21. Private Sub KundeBearbeiten()
    22. Dim frmKunde = dlgKunde
    23. frmKunde.KundeBindingSource.DataSource = KundeBindingSource.Current
    24. If frmKunde.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    25. frmKunde.KundeBindingSource.EndEdit()
    26. frmKunde.KundeBindingSource.RemoveCurrent()
    27. Else
    28. frmKunde.KundeBindingSource.CancelEdit()
    29. End If
    30. End Sub
    31. Private Sub FirmaBearbeiten()
    32. Dim frmFirma = dlgFirma
    33. frmFirma.FirmaBindingSource.DataSource = FirmaBindingSource.Current
    34. If frmFirma.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    35. frmFirma.FirmaBindingSource.EndEdit()
    36. frmFirma.FirmaBindingSource.RemoveCurrent()
    37. Else
    38. frmFirma.FirmaBindingSource.CancelEdit()
    39. End If
    40. End Sub
    Unschön dabei ist, dass du auf die Default-Instanzen der Dialoge zugreifst - das ist eiglich ein Hack - jo kann man benutzen, wenn man weiß was man tut, aber weißt du's?
    Dass dlgFirma gar kein Objekt ist, sondern ein Datentyp?

    Richtig problematisch ist das .RemoveCurrent() - warum removest du in den BindingSources immer den Current?

    Und warum ist dein Zip 260Kb gross?
    Ich hab geguckt, es sind die Resource-Dateien - je 500kb - was ist da monströses drinne?
    Hallo EdR,

    erstmal vielen Dank für das Lob und ebenso für die Kritik.
    Diese Selbstwiederholungen sind natürlich nicht schön, das wird auch noch geändert. DRY ist was anderes als mein Code, aber ich bin erstmal froh das ich meine Fortschritte mache und das Programm soweit funktioniert.
    Dann mache ich mich an den sauberen Code.

    Was genau meinst du mit den Default Instanzen der Dialoge? Ich hatte mir dein Tutorial angesehen, und es davon abgeleitet. Muss das ganze nochmal nachsehen und ausbessern.

    Das RemoveCurrent() ist eigentlich nicht gedacht gewesen. Diese Zeile hatte ich nur zu einem Test drin und vergessen sie ganz raus zu nehmen. Und beim Kopieren ist der Mist dann halt überall dabei. Danke für den Hinweis.

    Was die Resource Dateien betrifft, habe ich echt keine Ahnung, komischerweise sind sie nur so Groß nachdem ich sie mir dem SolutionExplorer gezippt habe. Beim Original sind die Dateien nicht so groß.
    Sehr Seltsam. Ich überprüfe mal ob ich einen Grund dafür finde.

    Grüße
    Sven
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    sind sie nur so Groß nachdem ich sie mir dem SolutionExplorer gezippt habe. Beim Original sind die Dateien nicht so groß.
    Das ist ja höchst mysteriös - um nicht zu sagen:
    alarmierend
    .
    ich kann den Fehler nicht reproduzieren, hab aber geguckt: Auch von anderen VBP-Usern hatiich zips erhalten mit derart überblähten Resource-Files drinne.
    Als du den SlEpl gezogen hast, hast du da die Exe gezogen, oder die Sources, uns selbst kompiliert?
    Ich habe mir die .exe runter geladen. Dann halt rechtsklick auf die .sln Datei ->öffnen mit SolutionExplorer und dann "BackZip".
    Sonst habe ich nichts weiter gemacht.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Ich habe mir die .exe runter geladen.
    So was funktioniert in den seltensten Fällen.
    Fremde Exen fragwürdiger Herkunft solltest Du nicht runterladen und schon gar nicht starten.
    Wenn Du die Quellen hast, kompiliere sie selbst und lass sie im DEBUG-Modus in der Entwicklungsumgebung laufen. Da bekommst Du die qualifiziertesten Meldungen, wenn was knallt.
    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 hab grad neulich ein SolutionExplorer-Update geuppt, und damit hab ich jetzt probiert, und wie gesagt: Es reproduziert den Fehler nicht.
    Kannst du vlt deine SolutionExplorer-Version zippen (dass sie nicht verloren geht, und dann neu downloaden?
    Wenn du die neue Version an genau den Ort stellst, wo vorher deine alte Version war, dann sollte der genau wie zuvor funktionieren.
    Und dann mal probieren, ob der Zip-Vorgang immer noch so aufbläht (machter bei mir nämlich nicht).
    Nun Funktioniert es einwandfrei. Die Dateien haben nun die selbe Größe wie das Original.
    Dann war es wohl vorher ein Problem, was bisher aber noch niemandem aufgefallen ist, oder es niemanden gestört hat. Nun geht es jedenfalls. Danke!
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    Nun habe ich ein Problem mit einer ComboBox.
    Diese sitzt nicht auf der Form1 sondern auf dlgRechnung. Also einem Dialog. Dort möchte ich nun mittles der Combobox einen Kunden anwählen können. Leider funktioniert das nicht wie ich es mir dachte.
    Liegt es daran das es nicht direkt die Form1 ist, sondern eine weitere Form (Dialog)?
    Anbei ein scrrenshot wie ich es mittels Datengebundener Combobox versucht habe.

    Ausgewählter Wert ist auch die KundenID....kann man Auf dem Bild nicht erkennen.
    Bilder
    • Neue Bitmap.jpg

      72,14 kB, 748×610, 98 mal angesehen
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    jo - bislang habich dieses unreflektierte benutzen der Form-Default-Properties ja so hingehen lassen, und wupps! - schön vor die Wand gefahren - so geht es nämlich nicht.

    Nun musst du doch verstehen, was eine Klasse ist, und was ein Objekt, und dass New ein Objekt erstellt, und solche Sachen.

    Also in deim MainForm hast du ein Dataset, und das befüllst du beim Startup.

    In deim Dlg hast du auch ein Dataset, ein zweites, - aber das ist leer.
    Im Designer hast du die Combo nu an dieses 2. Dataset gebunden - nu - da zeigt die logisch nix an - ist ja leer.

    Die Herausforderung bei derlei formübergreifendem Databinding ist, im Dlg alle BindingSources, die ans Dataset binden, umzustöpseln auf das Dataset, welches auffm MainForm liegt. Denn nur da sind die Daten drinne, und das sollte man auch tunlichst so belassen (keinesfalls mit einem 2. LadeVorgang, das 2. Dataset nu auch befüllen - das führt ins totale Chaos).

    guggemol Daten laden und speichern - ich glaub weiter unten widme ich mich auch diesem Problem (formübergreifendes Databinding).
    Hallo ErfinderDesRades,

    vielen Dank für die Kritik und gleichermassen für den Link und Tipp, wie ich mich verbessern kann.
    Ich hatte ja gefragt was Du mit den "Default Settings" gemeint hattest, denn soweit bin ich scheinbar nich nicht.
    Aber schön das Du mich quasi auflaufen lassen hast. Wohl der beste Weg seine Fehler zu sehen und daraus zu lernen. :thumbup:
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    naja - so richtig bewusst auflaufen lassen war nicht meine Absicht - das Problem ist einfach schwierig zu erklären, vor allem, solange alles (gefühlt) bestens funktioniert.
    Wenn Probleme auftauchen, findet man viel leichter Gehör mit dieser scheinbar feinsinnigen Unterscheidung von Klasse/Datentyp und Objekt.
    Also ein Datentyp ist kein Objekt, aber ein Objekt hat einen Datentyp - bzw. ist von einem Datentyp (etwa ein Objekt vom Typ String, oder ein Objekt vom Typ Form1).
    Alles gut, ich finde es nicht weiter schlimm, und meinte es absolut nicht böse.

    Allerdings habe ich gerade ein verständnis Problem. Du hast geschrieben das es unschön ist das ich auf die Default-Instanzen der Dialoge zugreife.
    Ich denke du meinst damit folgenden Beispielcode


    VB.NET-Quellcode

    1. Private Sub FirmaBearbeiten()
    2. Dim frmFirma = dlgFirma
    3. frmFirma.FirmaBindingSource.DataSource = FirmaBindingSource.Current
    4. If frmFirma.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    5. frmFirma.FirmaBindingSource.EndEdit()
    6. frmFirma.FirmaBindingSource.RemoveCurrent()
    7. Else
    8. frmFirma.FirmaBindingSource.CancelEdit()
    9. End If
    10. End Sub


    Was genau hast du damit gemeint?
    Ich versuche damit den aktuell im DGV angewählten Eintrag zu bearbeiten. Ich habe mittlerweile verstanden das ich auf anderen Forms das Dataset umstöpseln muss, um nicht noch weitere anzulegen die ja dann leer sind.
    Dies würde ich dann so lösen.

    VB.NET-Quellcode

    1. frmFirma.FirmaBindingSource.Dataource = Me.Dataset


    Damit allerdings finde ich keine Möglichkeit den aktuell angewählten Eintrag zu editieren.

    Vielleicht liege ich mit meiner Problemsuche auch Vollkommen daneben und meintest das Schlüsselwort New

    VB.NET-Quellcode

    1. Dim frmFirma = New dlgFirma



    Ganz nebenbei bin ich Dir echt Dankbar für deine Hilfenstellungen. :thumbup: :thumbsup:
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    jo, das mit der Unschönheit geht um New

    VB.NET-Quellcode

    1. Private Sub FirmaBearbeiten()
    2. Using frmFirma = New dlgFirma
    3. frmFirma.FirmaBindingSource.DataSource = FirmaBindingSource.Current
    4. If frmFirma.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then
    5. frmFirma.FirmaBindingSource.EndEdit()
    6. 'frmFirma.FirmaBindingSource.RemoveCurrent() <-- Dieses bitte endlich entfernen!!!!
    7. Else
    8. frmFirma.FirmaBindingSource.CancelEdit()
    9. End If
    10. End Using
    11. End Sub
    Hier wird eine neues dlgFirma-Objekt erzeugt, benutzt, und anschließend auch wieder aufgeräumt.
    Die Benutzung schließt mit ein, dass die FirmaBindingSource umgestöpselt wird vom lokalen leeren Dataset, auf einen einzigen Datensatz des OwnerForms.
    Das ist übrigens sehr interessant, dass das geht, eine BindingSource umzustöpseln von einer Tabelle auf einen einzelnen Datensatz.
    Hallo EdR,

    vielen Dank für die Antwort.

    VB.NET-Quellcode

    1. 'frmFirma.FirmaBindingSource.RemoveCurrent() <-- Dieses bitte endlich entfernen!!!!


    Sorry, dieses ist bereits entfernt. Ich hatte den Codeausschnitt von einem voherigen Post Kopiert. Das war nicht mein aktueller aus dem Programm da es mir nur um das verständnis ging.
    Diese Zeile habe ich schon nicht mehr. Ich bin ja Lernfähig :D
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.
    So ich habe nochmal ein wenig verändert,Designtechnisch.

    Das vorhaben mit dem Dialog was ich mal angesprochen hatte, habe ich vorerst beiseite gelegt da mir dazu noch ein wenig wissen fehlt, was aber voraussetzung ist.

    Ich habe ein Druckvorschau hinzugefügt, und versuche nun mit 2 Comboboxen den Kunden und das Rechnungsdatum zu selektieren.
    Ich kann mit den Comboboxen die Daten wie gewünscht auswählen.
    Leider aber scheitere ich daran wie ich gescheit auslesen kann welche Daten angewählt sind, um sie auch Drucken zu können.

    Vielleicht habe ich die Comboboxen auch falsch gebunden.
    Kann sich das bitte mal jemand anschauen?

    Edit: Die resource Dateien sind wieder so gross, und ich weiss nicht warum. Diesmal sind sie es aber auch im Original.
    Dateien
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

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

    ich hab die Icons rausgeworfen, nun sind die Resourcen normal-gross.

    Aber es fehlt eine Daten-Datei.
    Tip: Füge die Daten-Datei im ProjektmappenExplorer auch dem Projekt zu, dann wird die vom SolutionExplorer mit-gezippt.

    Zur Frage: in post#19 zeigst du doch Code, der eine KundRow ausliest - geht das jetzt iwie nicht mehr?

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

    Doch der Code funktioniert .

    VB.NET-Quellcode

    1. ' Combobox füllen
    2. cboFirma.Items.Clear()
    3. For i = 0 To KundeBindingSource.Count - 1
    4. Dim person2 = DirectCast(DirectCast(KundeBindingSource(i), DataRowView).Row, KundeRow)
    5. cboFirma.Items.Add(person2.Firma)
    6. Next
    7. Dim Kunde As String
    8. Kunde = cboFirma.SelectedItem


    Damit bekomme ich die Combobox befüllt.
    Allerdings ist sie, wenn ich den Reiter "Drucken" anwähle leer, und wenn ich einen Kunden Auswähle ubernimmt er das nicht wie gewünscht auf der Druckvorschau.

    Auch mit

    VB.NET-Quellcode

    1. PrintPreviewControl1.Invalidate()

    funktioniert es nicht. Damit sollte die Vorschau doch neu gezeichnet werden.

    Anbei nochmal mit Datendatei
    Dateien
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Damit bekomme ich die Combobox befüllt.
    Du willst doch gar keine Combo befüllen.

    Also den Kunde-String (wenn du ihn haben willst - tatsächlich brauchst du ihn überhaupt nicht) geht einfach so:

    VB.NET-Quellcode

    1. Dim person2 = DirectCast(DirectCast(KundeBindingSource.Current, DataRowView).Row, KundeRow)
    2. Dim Kunde As String=person2.Firma

    Aber das sollte sich eiglich auch ergeben haben, aus den Tuts, die gelegentlich verlinktete - verlinktete ich schon dieses?
    programming the typed Dataset

    obiges ist natürlcih schlecht benamt, einen Kunde-Datensatz als "Person" zu deklarieren - ordentlich wäre:

    VB.NET-Quellcode

    1. Dim rwKunde = DirectCast(DirectCast(KundeBindingSource.Current, DataRowView).Row, KundeRow)
    2. Dim firma As String=rwKunde.Firma
    und da sieht man, dass zeile#2 üflüssig ist, denn man hat ja rwKunde, und da ist der Firma-Wert ja ein Bestandteil von.
    Danke,
    problem verstanden und behoben :D

    So habe ich das nun für die Auflistung der Posten umgesetzt:

    VB.NET-Quellcode

    1. For i = 0 To FKRechnungPostenBindingSource.Count - 1
    2. Dim rwPosten = DirectCast(DirectCast(FKRechnungPostenBindingSource(i), DataRowView).Row, PostenRow)
    3. .DrawString(rwPosten.Anzahl, New Font("Constantia", 11, FontStyle.Bold), Brushes.Black, x, y + 400, stringFormat)
    4. .DrawString(rwPosten.Betrag.ToString("0.00") & " " & "€", New Font("Constantia", 11, FontStyle.Bold), Brushes.Black, x + 680, y + 400, stringFormat)
    5. y += LineHeight
    6. Next


    Jetzt hätte ich gerne aber noch den NAMEN der Artikel aufgelistet. Dies Funktioniert aber nicht, da bekomme ich eine Invalid.Cast.Exception

    VB.NET-Quellcode

    1. For i = 0 To FKArtikelPostenBindingSource.Count - 1
    2. Dim rwArtikel = DirectCast(DirectCast(FKArtikelPostenBindingSource(i), DataRowView).Row, ArtikelRow)
    3. .DrawString(rwArtikel.Name, New Font("Constantia", 11, FontStyle.Bold), Brushes.Black, x, y + 400, stringFormat)
    4. y += LineHeight
    5. Next


    Hier kann ich nur auf die PostenRow casten.
    Wie kann ich denn nun auf den Artikelnamen zugreifen die den Posten zugeordnet sind? Die Posten sind ja wiederum einer Rechnung zugeordnet.
    Rechtschreibfehler betonen den künstlerischen Charakter des Autors.

    Akanel schrieb:

    Hier kann ich nur auf die PostenRow casten.
    Natürlich.
    in der PostenBindingSource sind numal Posten drin, da kann man keine Artikel rausholen.

    Einen Cast kannst du dir vorstellen wie ein Etikett, was draufgeklebt wird, damit der Compiler bescheid weiss.
    Denn in einer BindingSource kann alles drin sein, daher haben deren Item den Datentyp Object - das kann wie gesagt alles sein.
    Aber der Compiler hat keinerlei Typinformationen über das Objekt, deshalb kann er nichts damit tun.
    Also castest du, als gibst ihm händosch die TypInformation, die er braucht ("Etikett aufkleben").
    Und kann natürlich nicht funktionieren, auf eine PostenRow das Artikel-Etikett draufzukleben, denn ein Posten ist numal kein Artikel.

    Aber guck mal die Posten-Klasse im ObjectBrowser an, ob die nicht iwie einen Verweis hat auf den Artikel - es ist einfacher als du denkst - du musst den OB nur auch benutzen.