2 mittelgroße Probleme

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

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Lord C.

    2 mittelgroße Probleme

    Guten Morgen lieb VB-Paradise-Community,

    ich haben zurzeit ein kleines Problem in meinem Programm. Ich habe eine DB(Access 2007) eingbunden, die Verbindung passt auch.
    Problem 1:
    Ich habe die erste Tabelle in der DB wie erwähnt schon geladen. Dann hab ich insgesamt 4 comboboxen(cb), inden ich aus der DB zeilen einlesen will, das geht auch aber ich will jede einzeln verändern, und dies geht nicht wenn ich eine veränder gehen alle mit. Ebenfalls will ich wenn ich eine cb ausgewählt haben und auf einen Button drücke die zellen, die inder DB daneben stehen in die tb einlesen.
    Hier mal der Code:

    VB.NET-Quellcode

    1. #Region "Variablen"
    2. Dim nextoption As String
    3. Dim connectionstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\SQL\Belohnung.accdb"
    4. Dim verbindung As New System.Data.OleDb.OleDbConnection(connectionstring)
    5. Dim adapter As New System.Data.OleDb.OleDbDataAdapter
    6. Dim Tabelle As New System.Data.DataTable
    7. Dim verbindung2 As New System.Data.OleDb.OleDbConnection(connectionstring)
    8. Dim adapter2 As New System.Data.OleDb.OleDbDataAdapter
    9. Dim Tabelle2 As New System.Data.DataTable
    10. #End Region
    11. #Region "Bei Start"
    12. Private Sub form_rechner_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. verbindung.Open()
    14. adapter = New System.Data.OleDb.OleDbDataAdapter("Select * from belohnungen", verbindung)
    15. adapter.Fill(Tabelle)
    16. cb_du_du1.DataSource = Tabelle
    17. cb_du_du1.DisplayMember = "weg"
    18. cb_du_du2.DataSource = Tabelle
    19. cb_du_du2.DisplayMember = "weg"
    20. cb_du_du3.DataSource = Tabelle
    21. cb_du_du3.DisplayMember = "weg"
    22. cb_du_du4.DataSource = Tabelle
    23. cb_du_du4.DisplayMember = "weg"
    24. End Sub
    25. #End Region

    Der Button ist noch leer da ich bisher auf keine idee gekommen bin.

    Problem 2:
    Nun wollte ich beim laden des Formulars aus der DB bestimmte Zellen auslesen und diese in eine TB(Textbox) einfügen. Diese liegen in der Anderen Tabelle. Dort geht die Verbindung auch schon. Der Code sieht bisher so aus:

    VB.NET-Quellcode

    1. #Region "Variablen"
    2. Dim nextoption As String
    3. Dim connectionstring As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\SQL\Belohnung.accdb"
    4. Dim verbindung As New System.Data.OleDb.OleDbConnection(connectionstring)
    5. Dim adapter As New System.Data.OleDb.OleDbDataAdapter
    6. Dim Tabelle As New System.Data.DataTable
    7. Dim verbindung2 As New System.Data.OleDb.OleDbConnection(connectionstring)
    8. Dim adapter2 As New System.Data.OleDb.OleDbDataAdapter
    9. Dim Tabelle2 As New System.Data.DataTable
    10. #End Region
    11. #Region "Bei Start"
    12. Private Sub form_rechner_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    13. verbindung.Open()
    14. adapter = New System.Data.OleDb.OleDbDataAdapter("Select * from belohnungen", verbindung)
    15. adapter.Fill(Tabelle)
    16. cb_du_du1.DataSource = Tabelle
    17. cb_du_du1.DisplayMember = "weg"
    18. cb_du_du2.DataSource = Tabelle
    19. cb_du_du2.DisplayMember = "weg"
    20. cb_du_du3.DataSource = Tabelle
    21. cb_du_du3.DisplayMember = "weg"
    22. cb_du_du4.DataSource = Tabelle
    23. cb_du_du4.DisplayMember = "weg"
    24. adapter2 = New System.Data.OleDb.OleDbDataAdapter("Select * from speichern", verbindung2)
    25. adapter2.Fill(Tabelle2)
    26. tb_marken_marke1
    27. End Sub
    28. #End Region

    ab dem marke1 weiß ich nicht weiter.

    Ich hoffe ihr könnt mir helfen.
    Gruß Lord C

    Lord C schrieb:

    ich will jede einzeln verändern, und dies geht nicht wenn ich eine veränder gehen alle mit.

    So ist das mit Databinding. Du bindest alle ComboBoxen an dieselbe Quelle. Wählst du nun einen Eintrag in einer Combobox aus, ändert das den aktuellen Datensatz deiner Quelle, und die gibt diese Änderung an alle anderen gebundenen Steuerelemente weiter. Wenn du vier unabhängige Comboboxen brauchst (ich hinterfrag mal nicht, wofür), brauchst du auch vier unabhängige Datenquellen (in diesem Fall Tabellen).
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Arby schrieb:

    Lord C schrieb:

    ich will jede einzeln verändern, und dies geht nicht wenn ich eine veränder gehen alle mit.

    So ist das mit Databinding. Du bindest alle ComboBoxen an dieselbe Quelle. Wählst du nun einen Eintrag in einer Combobox aus, ändert das den aktuellen Datensatz deiner Quelle, und die gibt diese Änderung an alle anderen gebundenen Steuerelemente weiter. Wenn du vier unabhängige Comboboxen brauchst (ich hinterfrag mal nicht, wofür), brauchst du auch vier unabhängige Datenquellen (in diesem Fall Tabellen).


    Danke für den Tipp. Es geht darum weil es was zum berechnen sein soll das mit dem button dann weiter geleitet wird. :D darum 4 voneinander unabhängige cb.
    ich rate von untypisierten DataTables, wie du sie in deim Code erzeugst, ab.
    Ich würde den gesamten Datenbank-Zugriff hintanstellen, und erstmal die Geschichte mit typisierten Datasets und Databinding richtig in den Griff kriegen.
    son TypDataset speichert man vorläufig erstmal als xml-Datei, bis die Funktionalität ausgereift ist.
    Dann ist immer noch zeit, die Xml-Datei durch richtige DB-Zugriffe auszutauschen.

    Erstmal hast du Databinding-Probleme, und da guge vlt. mal vier Views-Videos, um das Konzept mit den BindingSources, und wie man daran bindet, zu verstehen.

    Lord C schrieb:

    #Region "Variablen"
    Initialisiere dort die Variablen und pack die Instanziierung in eine geeignete Prozedur Init(), die genau dann aufgerufen wird, wenn Du es willst.
    Dann kannst Du die Verbindung auch wieder schließen und re-öffnen.
    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!

    ErfinderDesRades schrieb:

    ich rate von untypisierten DataTables, wie du sie in deim Code erzeugst, ab.
    Ich würde den gesamten Datenbank-Zugriff hintanstellen, und erstmal die Geschichte mit typisierten Datasets und Databinding richtig in den Griff kriegen.
    son TypDataset speichert man vorläufig erstmal als xml-Datei, bis die Funktionalität ausgereift ist.
    Dann ist immer noch zeit, die Xml-Datei durch richtige DB-Zugriffe auszutauschen.

    Erstmal hast du Databinding-Probleme, und da guge vlt. mal vier Views-Videos, um das Konzept mit den BindingSources, und wie man daran bindet, zu verstehen.

    Ich habe meinen Azubikollegn gefragt weil der hat das schon gemacht. Wir lernen das so inder schule, ist drittjahrstoff. Ich werde mir aber trozdem mal die Videos anschauen wenn ich daheim bin, bin atm auf arbeit.

    RodFromGermany schrieb:

    Lord C schrieb:
    #Region "Variablen"

    Initialisiere dort die Variablen und pack die Instanziierung in eine geeignete Prozedur Init(), die genau dann aufgerufen wird, wenn Du es willst.
    Dann kannst Du die Verbindung auch wieder schließen und re-öffnen.


    das mit dem Init verstehe ich nicht was macht das dann genau geht es nur darum die während der Ausführung zu öffen ud zu schließen per call?
    @Lord C Bitte zitiere nicht die gesamten Posts über Dir, das ist hier nicht gewünscht.
    Deine Konstruktion wird beim Instanziieren der Klasse im Konstruktor aufgerufen, dann ist das Geschichte.
    Wenn Du die ein zweites Mal zur DB verbinden willt, musst Du die Klasse zerstören und erneut instanziieren.
    Wenn Du das mit Init() und Exit() (natürlich mit Deinen Namen) machst, ist das ordentlicher Programmierstil.
    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!

    Lord C schrieb:

    Wir lernen das so inder schule
    oh jeh!

    jdfs., was Arby schon sagte: Wenn mehrere Comboboxen an dieselbe Datatable gehängt werden, dann zeigen alle auch immer denselben Datensatz an.
    Das liegt daran, dass WinForms es ühaupt nicht vorsieht, Comboboxen an DataTables zu hängen.
    Man schaltet BindingSources dazwischen, und nun kann man differenziert steuern: Hängt man mehrere Combos an dieselbe BindingSource, so sind sie synchron (was ja erwünscht sein kann).
    Schaltet man hingegen für jede Combo eine eigene BS dazwischen, so kann jede Combo einen eigenen Datensatz anzeigen.
    So wird, was dir hier als Problem erscheint, Teil des Gestaltungs-Spielraums, den Databinding bietet.

    Aber mit BindingSources fummelt man normal im Form-Designer, nicht im Code, aber ihr in der Schule müsst wohl leider...
    Was schule angeht haben wir eh einen etwas bekloppteren Lehrer :D Sein Unterricht: Kommt rein knallt uns ein Blatt hin und sagt macht. Keine fragen in der ersten Stunde. (Wir haben ihn 3 stunden am Stück)

    BTT
    Die erste Codestruktur brauch ich nur wenn ich den Teil den Programms betrete den zweiten nur beim load. Also lass ich am besten den erstecode beim load drinn und close die verbingung nach dem einlesen und dann wenn ich in den berecih gehe open ich die mit dem zweiten code wo ich vorher ausgelagert habe oder?
    ich sehe keinen Unterschied zw. deim ersten Code und deim 2. Code - du sprichst doch von den Listings in post#1, oder?

    Daher ist da mit Sicherheit was falsch, denn wenn ein Proggi an 2 Stellen den gleichen Code enthält, stimmt was am Code-Design nicht.
    Auch erklärst du nicht, was diese Codes machen sollen - also ich hab nichts dagegen, wenn du so tust, wie du denkst.

    Mein Verständnis jdfs. schnallt völig ab bei Formuliereungen wie "ich betrete den zweiten nur beim load" , oder gar "und dann wenn ich in den berecih gehe open ich die mit dem zweiten code wo ich vorher ausgelagert habe oder? "
    Sry dachte es währe eindeutig was ich meine, war mein fehler :D .

    Mit dem zweiten Code ist nur der Abschnitt gemeint:

    VB.NET-Quellcode

    1. verbindung2.Open()
    2. adapter2 = New System.Data.OleDb.OleDbDataAdapter("Select * from speichern", verbindung2)
    3. adapter2.Fill(Tabelle2)

    Mit dem ich beim Start bestimmte TB füllen will.

    Ich hoffe das hilft.
    Was mir als erstes auffällt, weiß nicht ob du das mit "komm nicht mehr weiter" meinst, aber du hast in deinem ConnectionString "...;Data Source=..." geschrieben => DataSource gehört zusammengeschrieben :D
    ConnectionStringBuilder hilft da wahnsinnig :D
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    es sind 4 combo boxen und 8 für das ding mit dem comboboxen, da will cih die comboboxen trenn das weiß ich ja jetzt wie. Die sollen immer aktive sein, ebenfalls soll die tb bei den combo boxen sich füllen je nachdme was ausgewählt ist. Das steht in der gleichen table nur ne andere spalte. Die soll sich dann füllen wenn cih einen button drücke, der atm leer ist.

    dann gibt es noch 9 textboxen. die sollen sich bei laden des forumlars mit dem inhalt aus der 2ten table füllen.