Formübergreifende datasource

  • VB.NET

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

    Formübergreifende datasource

    Hallo,
    ich fange mal ein neues Thema an, denn es könnte länger dauern :)
    Vereinzelt finde ich zwar was zu meinem Problem, aber auch nicht so richtig.

    Also:
    Formübergreifendes databinding

    Ich habe eine Form1, in der lege ich einen Kunden mit Name und Vorname an.

    Dann kommt die Form2: dort möchte ich den ganzen Rest eingeben. (Straße, PLZ etc.)
    Dem ganzen liegt kein dgv zu Grunde, sondern einzelne Textboxen.

    Liege ich jetzt richtig in der Annahme, das ich zb. über einen Button die row dem dementsprechendem Table hinzufügen muss?
    Oder geht das auch ähnlich dem, wenn ich ein dgv habe und "hinzufügen aktiviere" mache.

    Wie bekomme Ich es hin, dass nur das in der textbox angezeigt wird, was auch zu dem Kunde gehört?
    "Mann" lernt mit seinen Projekten.

    kiter20 schrieb:

    Liege ich jetzt richtig in der Annahme, das ich zb. über einen Button die row dem dementsprechendem Table hinzufügen muss?
    Ja. In einem DGV ist der "Button" die Reaktion auf das Eintragen von Werten in eine spezielle Zeile (die mit dem Stern). Wenn du kein DGV hast, musst du der Tabelle das Hinzufügen einer neuen Zeile auf anderem Wege mitteilen.

    kiter20 schrieb:

    Oder geht das auch ähnlich dem, wenn ich ein dgv habe und "hinzufügen aktiviere" mache.
    Geht auch - schau dir den BindingNavigator an. An den kannst du deine TextBoxen binden und er beinhaltet bereits einen Button zum Erstellen neuer Zeilen.

    kiter20 schrieb:

    Wie bekomme Ich es hin, dass nur das in der textbox angezeigt wird, was auch zu dem Kunde gehört?
    Du brauchst einen Primärschlüssel, der einen Kunden eindeutig identifiziert. Der Name reicht dazu nicht aus - besser ist eine Kundennummer.
    Gruß
    hal2000
    Bockmist !

    Habe irgendwie mist gemacht.
    Mir war aufgefallen, dass in der DB ein paar Beziehungen falsch gesetzt waren.
    Daraufhin hatte ich versucht die im Projekt mit der änderung einzulesen. Hat alles nicht so richtig gefuntzt.
    Dann habe ich das dataset gelöscht und wollte die DB wieder neu in das Projekt einbinden.

    Wie bekomme ich denn das alte komplett raus, damit ich nicht dataset1 connectionstrin1 etc. habe?

    Ahhhhhhh ;(

    Der code soll doch sauber bleiben.
    "Mann" lernt mit seinen Projekten.
    Entferne einfach dein Dataset aus deinem Projekt und den ConnectionString entfernst du einfach aus den My.Settings...
    Danch erstellst du dein Projekt neu... (ev. tust du noch bereinigen...)

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

    Da ist noch irgendwo nen falscher Pfad drin.

    Wenn der TableAdapter update.all macht, gibt es nen fehler, dass eEr nicht auf die DB zugreifen kann.
    Der Angezeigte Pfad ist auch murks.

    Ich weise den DataDirectory Pfad manuell zu.
    Hier habe ich mal gecheckt, ob der zuzuweiende Pfad richtig ist und der der zugewiesene auch.

    VB.NET-Quellcode

    1. 'DB Pfad für connection string zuweisen
    2. MessageBox.Show(_DatenbankPfad)
    3. AppDomain.CurrentDomain.SetData("DataDirectory", _DatenbankPfad)
    4. MessageBox.Show(CStr(AppDomain.CurrentDomain.GetData("DataDirectory")))

    Alles IO.

    Habe gerade in die App.config beim connection string Müll reingeschrieben. >>> Da wird anscheinend gar nicht drauf gekuckt !

    Da müssen noch irgendwo Leichen bei mir im Prog sein.

    Was ist die Settings.Settings Datei?

    HTML-Quellcode

    1. <?xml version='1.0' encoding='utf-8'?>
    2. <SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="My" GeneratedClassName="MySettings" UseMySettingsClassName="true">
    3. <Profiles />
    4. <Settings>
    5. <Setting Name="ProjektdatenbankConnectionString" Type="(Connection string)" Scope="Application">
    6. <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
    7. &lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
    8. &lt;ConnectionString&gt;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Projektdatenbank.mdb&lt;/ConnectionString&gt;
    9. &lt;ProviderName&gt;System.Data.OleDb&lt;/ProviderName&gt;
    10. &lt;/SerializableConnectionString&gt;</DesignTimeValue>
    11. <Value Profile="(Default)">Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Projektdatenbank.mdb</Value>
    12. </Setting>
    13. <Setting Name="ProjektdatenbankConnectionString1" Type="(Connection string)" Scope="Application">
    14. <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
    15. &lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
    16. &lt;ConnectionString&gt;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\bin\Debug\Datenbank\Projektdatenbank.mdb&lt;/ConnectionString&gt;
    17. &lt;ProviderName&gt;System.Data.OleDb&lt;/ProviderName&gt;
    18. &lt;/SerializableConnectionString&gt;</DesignTimeValue>
    19. <Value Profile="(Default)">Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\bin\Debug\Datenbank\Projektdatenbank.mdb</Value>
    20. </Setting>
    21. <Setting Name="Database1ConnectionString" Type="(Connection string)" Scope="Application">
    22. <DesignTimeValue Profile="(Default)">&lt;?xml version="1.0" encoding="utf-16"?&gt;
    23. &lt;SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"&gt;
    24. &lt;ConnectionString&gt;Data Source=|DataDirectory|\Database1.sdf&lt;/ConnectionString&gt;
    25. &lt;ProviderName&gt;Microsoft.SqlServerCe.Client.4.0&lt;/ProviderName&gt;
    26. &lt;/SerializableConnectionString&gt;</DesignTimeValue>
    27. <Value Profile="(Default)">Data Source=|DataDirectory|\Database1.sdf</Value>
    28. </Setting>
    29. </Settings>
    30. </SettingsFile>



    "Mann" lernt mit seinen Projekten.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „kiter20“ ()

    Ich habe aufgegeben. :(

    ........
    Restart

    Neues Projekt und den Code kopiert.

    Funzt erstmal wieder so besch.. wie vorher :thumbsup:

    Aber ev. könnt Ihr mir ja sagen was ich falsch gemacht hatte.
    Wie gehe ich vor, wenn ich an der DB etwas ändere und das dann in das dataset haben möchte?
    "Mann" lernt mit seinen Projekten.
    wurde doch schon gesagt:
    1. Backup machen
    2. Altes Dataset weghauen (achtung - in diesem Zustand ist das Projekt nicht mehr lauffähig, und viele Form-Designs im Form-Designer sind komplett im Eimer)
    3. komplett neues Dataset aus der DB re-generieren. (waren die Änderungen nicht zu gravierend, gehen die Forms wieder)

    Alles ist ein gut Stück einfacher, wenn man die DB erstmal weglässt, und die Anwendung nur mit typisiertem Dataset entwickelt. Das kann man ja auch komplett mit .ReadXml, .WriteXml laden/speichern

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

    hal2000 schrieb:

    Du brauchst einen Primärschlüssel, der einen Kunden eindeutig identifiziert. Der Name reicht dazu nicht aus - besser ist eine Kundennummer.


    Den habe ich.
    Aber müsste sich die Form 2 selber füllen?
    Oder muss ich das per code machen?

    In einem anderen Projekt hatte ich auf der selben Form Die parent und childrows angezeigt.
    Dort wurde mir die Arbeit das immer passend anzuzeigen abgenommen.

    Aber wie ist das wenn das über 2 Forms geht?
    Reicht das umstöpseln der Bindingsource ?
    "Mann" lernt mit seinen Projekten.
    also erstmal ein Form tut man niemals füllen. Es ist das Dataset, was befüllt wird. Auffm Form liegen Controls, die über BindingSources ans Dataset gebunden sind.

    Und wichtig: Blos nicht mehrere Datasetse befüllen! Da gibt man dann ins eine Dataset was ein, und speichert das andere ab - also das gibt ein Mords-Durcheinander - mal ganz abgesehen von der Resourcen-Verschwendung.

    Ja, das mit dem Umstöpseln der BindingSources ist unschön - aber eine reelle Alternative sehe ich nicht: Willst du dieselben Daten auf einem 2. Form anzeigen, müssen dessen BindingSources ans Dataset des MainForms angeschlossen sein. Das eigene Dataset des 2. Forms extra nochmal zu befüllen ist wie gesagt keine Option.
    In meine Extensions hab ich dafür eine Methode gebastelt, die sucht via Reflection das Form nach Bindingsources ab, und stöpselt alle auf das einzige Dataset um, und ersetzt sogar das Dataset auf dem 2. Form durch das einzige, und disposed das überflüssige Dataset, was keiner braucht, und was nur Verwirrung stiften würde.
    Ach hab sowas auch schon mal gemacht, allerdings ein wenig anders als ErfinderDesRades gelöst. Auf der zweiten Form hab ich einfach ein leeres DataGridView platziert, das erstmal an nichts gebunden war. An den Konstruktor der zweiten Form hab ich dann die DataSources der ersten Form übergeben und manuell an das DataGridView gebunden (dafür hab ich einfach mal kurz in die Designer-Datei der ersten Form reingeschaut). Geht natürlich so mit allen möglichen Controls.
    @Artentus
    Solange es nur ein DGV mit einer einfachen Anzeige ist, ist es Jacke wie Hose, finde ich. Sobald du aber eine etwas komplexere Anzeige mit mehreren Bindingsourcen (z.b. mit ComboBoxColumn) und/oder mehreren anderen Controls, ist es viel bequemer, alles im Designer zu binden und mit einer Zeile einfach die "obere" Bindingsource umzustöpseln, weitere Bindingsourcen hängen ja meistens von der oberen ab, also müssen sie gar nicht mehr verändert werden.

    ErfinderDesRades schrieb:

    BindingSources ans Dataset des MainForms angeschlossen sein


    sonne75 schrieb:

    weitere Bindingsourcen hängen ja meistens von der oberen ab, also müssen sie gar nicht mehr verändert werden.

    Irgendwie gehts nicht in meinen Schädel. ?(

    Fangen wir mal klein an.

    Dies ist quasi der code aus der Form, in der ich den Kunden auswähle.
    Dann möchte ich die Adressenverwaltung starten und das dataset mitnehmen.

    VB.NET-Quellcode

    1. Public Class FormSelectKunde
    2. #Region "Form laden"
    3. Private Sub FormSelectKunde_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Me.KndNrTableAdapter.Fill(Me.ProjektdatenbankDataSet.KndNr)
    5. End Sub
    6. #End Region
    7. Private Sub cmdAdressverwaltung_Click(sender As Object, e As EventArgs) Handles cmdAdressverwaltung.Click
    8. Dim laden As New FormLoad
    9. laden._FormAdressenverwaltungLaden()
    10. FormAdressenverwaltung.KndNrBindingSource.DataSource = Me.ProjektdatenbankDataSet
    11. FormAdressenverwaltung.KommunikationBindingSource.DataSource = Me.ProjektdatenbankDataSet
    12. FormAdressenverwaltung.AdresseBindingSource.DataSource = Me.ProjektdatenbankDataSet
    13. Dim current = DirectCast(DirectCast(KndNrBindingSource.Current, DataRowView).Row, KndNrRow)
    14. _currentKontakt = current.Lf_Knd_ID
    15. End Sub


    Dann möchte ich auf der AdressenverwaltungForm in einer textbox den ausgewählten Namen angezeigt bekommen.
    Dafür hatte ich mir aus den Datenquellen das Element in die Form gezogen.

    Wenn nun die Form öffnet, ist das Feld leer. Warum?
    "Mann" lernt mit seinen Projekten.
    ich vermute, dass bereits das Datenmodell untauglich ist. Weil eine Tabelle KdNr sollte es nicht geben.

    Auch stopselst du vlt. BindingSources um, die garnet umzustöpseln wären. Weil nur die Bindingsources, die direkt ans Dataset angeschlossen sind, sind umzustöpseln. BindingSources, die an andere Bindingsources angeschlossen sind, nicht.

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

    Ok, da gebe ich dir recht, dass dort die namensgebung etwas unglücklich ist.

    Habe mal ne form gemacht, auf die ich mir die Tables draufgezogen habe.
    Wenn ich mal davon absehe, dass die DB nichtb geladen wird.....

    Das dataset schein ok zu sein. Ich kann Daten eintragen und es wird dann dementsprechend angezeigt wenn ich zwischen den Einträgen wechsel.
    "Mann" lernt mit seinen Projekten.

    ErfinderDesRades schrieb:

    Auch stopselst du vlt. BindingSources um, die garnet umzustöpseln wären. Weil nur die Bindingsources, die direkt ans Dataset angeschlossen sind, sind umzustöpseln. BindingSources, die an andere Bindingsources angeschlossen sind, nicht.
    Nachdem wir nun also festgestellt haben, dass dein Datenmodell in Ordnung ist ;) - hast du diesen Punkt auch überprüft?

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

    ErfinderDesRades schrieb:

    hast du diesen Punkt auch überprüft?


    Habe gerade ein Projekt mit einem mini dataset erstellt, ohne irgendwelchen anderen Kram.
    Habe dort jetzt umgestöpselt:

    VB.NET-Quellcode

    1. Form2.DataTable1BindingSource.DataSource = Me.DataSet1

    Jetzt wurde mir in der textbox der 2.Form der 1. Eimtrag aus dem Table angezeigt.

    Mir ist gerade aufgefallen, dass Ich ev. gar nicht genau genug beschrieben habe, was ich möchte.

    Wenn ich in der MainForm einen Namen auswähle, bekomme ich den über die bindingsource.current.
    Muss ich mir das merken, bevor ich umstöpsel? oder ist der gewählte Eintrag weiterhin auf der 2.Form über .current erreichbar?
    "Mann" lernt mit seinen Projekten.
    ausprobieren und selber denken:
    Also du hast 2 Forms, auf jedem eine Bindingsource. BindingSource hat eine Current-Verwaltung, also alles, was an eine BS angeschlossen ist, ist synchronisiert.
    Nun hast du 2 BindingSources, wie gesagt, auf jedem Form eine - zum Glück sind sie inzwischen an dasselbe Dataset angeschlossen.
    Jede hat eine Current-Verwaltung.
    Wenn du nun auf einem Form über ein angeschlossenen Control einen Datensatz anwählst - weiß die andere BindingSource davon?

    drüber nachdenken, und dann die Hypothese an der Praxis gegenprüfen.

    kiter20 schrieb:

    Mir ist gerade aufgefallen, dass Ich ev. gar nicht genau genug beschrieben habe, was ich möchte.
    Ja, das kann sein.
    Oft will man eine Eingabe-Maske bauen, die als Dialog aufpoppt, wenn man einen im Hauptform selektierten Datensatz bearbeiten will. Wäre das eine genau genug beschrieben, was du möchtest? ;)
    Dafür hätte ich eine Extension geschrieben. :D

    ErfinderDesRades schrieb:

    weiß die andere BindingSource davon?


    Nein.

    Habe mir jetzt die .Position gemerkt und nach dem Laden der Form die bindingsource darauf gesetzt.



    "Mann" lernt mit seinen Projekten.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „kiter20“ ()