VB 2008 (.Net), Formular neu laden ?

Hallo Leute

Ich habe ein Formular, was mir Teil-Inhalte (Felder) aus einer Datenbank einzeigt (Kundennummer, Kundenname). Nennen wir es Form1. Nun habe ich ein zweites Formular, in das ich die Daten eingebe. Nennen wir es Form2. Dort kann man viele Daten für Kunden anlegen.
Form1 und Form2 sind aktiv wenn ich meine Anwendung starte, also auf dem Desktop zu sehen. Nun möchte ich nach der Eingabe in Form2, dass die Daten in Form1 aktuallisiert werden (neu gezogen werden).

Ich bin neu im Thema VB.Net oder VB 2008 und habe im Handbuch folgendes Gefunden:

  1. Lege einen Button an im Form1
  2. Hinterlege folgenden Code für den Button:

Private Sub Button_Click(…blablabla…) Handles Button.Click

Me.Refresh()

End Sub

Doch leider funzt das dann nicht. Wenn ich den Button anklicke bleiben die Werte und werden nicht neu gezogen.

Beispiel:
Ich habe im Form2 einen neuen Kunden angelegt und gespeichert.
In der Datenbank ist dieser Kunde dann auch zu sehen.
Gehe ich nun rüber in mein Form1 mit meiner Mini-Liste und
klicke dort auf den Button für den Refresh, werden die Daten
nicht neu gezogen und ich sehe den neuen Kunden nicht. Erst
wenn ich die Anwendung schließe und neu starte sehe ich in Form1
auch den neu angelegten Kunden.

Vorab schon mal DANKE für jeden hilfreichen Post (Antwort).

Hallo Leute

Hallo Leut!

Ich habe ein Formular, was mir Teil-Inhalte (Felder) aus einer
Datenbank einzeigt (Kundennummer, Kundenname). Nennen wir es
Form1. Nun habe ich ein zweites Formular, in das ich die Daten
eingebe. Nennen wir es Form2. Dort kann man viele Daten für
Kunden anlegen.
Form1 und Form2 sind aktiv wenn ich meine Anwendung starte,
also auf dem Desktop zu sehen.

Wie das? Von alleine passiert das nicht, also musst Du irgendwo Show() oder ShowDialog() für die Dialoginstanzen aufgerufen haben. Diese Stelle/Klasse merkst Du Dir…

Nun möchte ich nach der Eingabe in Form2, dass die Daten in Form1 aktuallisiert werden (neu
gezogen werden).

…und verwendest sie, um genau dort die Kommunikation zwischen Form1 und Form2 zu realisieren, da Du an dieser Stelle Referenzen auf beide Dialoginstanzen hast.

Ich bin neu im Thema VB.Net oder VB 2008 und habe im Handbuch
folgendes Gefunden:

  1. Lege einen Button an im Form1
  2. Hinterlege folgenden Code für den Button:

Private Sub Button_Click(…blablabla…) Handles Button.Click

Me.Refresh()

End Sub

In welchem Handbuch steht denn so ein Quark? Schau’ mal in der Framework-Doku nach, was Form.Refresh() eigentlich macht, dann wirst Du sehen, dass außer dem sofortigen Neuzeichnen des Dialogs nix passiert - kein Aktualisieren von Daten o.ä.

Doch leider funzt das dann nicht. Wenn ich den Button anklicke
bleiben die Werte und werden nicht neu gezogen.

Erstmal brauchst Du in Form1 ein Ereignis, das der steuernden Klasse (die, die Du Dir vorhin gemerkt hast) sagt, dass jetzt neue Daten vorhanden sind.
Dann brauchst Du noch eine public-Methode in Form2, die die Daten aktualisiert (je nachdem, was Du konkret für Controls auf Form2 hast, wird es immer anders aussehen - ohne den entsprechenden Code zu sehen, kann ich es Dir nicht genauer sagen). Diese Methode rufst Du in der Ereignisbehandlungsroutine des „Neue Daten“-Ereignisses auf - fertig.

Beispiel:
Ich habe im Form2 einen neuen Kunden angelegt und gespeichert.
In der Datenbank ist dieser Kunde dann auch zu sehen.
Gehe ich nun rüber in mein Form1 mit meiner Mini-Liste und
klicke dort auf den Button für den Refresh, werden die Daten
nicht neu gezogen und ich sehe den neuen Kunden nicht. Erst
wenn ich die Anwendung schließe und neu starte sehe ich in
Form1
auch den neu angelegten Kunden.

Vorab schon mal DANKE für jeden hilfreichen Post (Antwort).

Gruß,
Martin

Hi Martin

Danke für dein Post. Ich hab hier so ein Mini-PDF Handbuch aus dem iNet, aber kann auch sein, dass ich das einfach falsch verstanden habe was da steht. Ich versuche jetzt mein Prob. genauer zu beschreiben.

Form1 [form_funktionen]: (wird geladen und auf dem Desktop angezeigt, nach Durchlauf eines Logins); es enthält derzeit nur Buttons die auf Klick reagieren und andere Forms aktivieren, sowie ein Databindung zur Access-DB und einen Timer der alle 2 Sekunden ein Refresh macht =>

Public Class form_funktionen

Private Sub form_funktionen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

'TODO: Diese Codezeile lädt Daten in die Tabelle „_db2_2008_02_14DataSet.Kundenliste“.
'Sie können sie bei Bedarf verschieben oder entfernen.
Me.KundenlisteTableAdapter.Fill(Me._db2_2008_02_14DataSet.Kundenliste)

'TODO: Spielt eine Anwendungsmusik ein
My.Computer.Audio.Play(„C:\MM_Abend.wav“, AudioPlayMode.Background)

End Sub

'TODO: Öffnet einen Color-Dialog
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button7.Click
ColorDialog1.ShowDialog()
Me.BackColor = ColorDialog1.Color
End Sub

'TODO: Öffnet einen Weblink
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles MyBase.Load
LinkLabel1.Text = „http://www.123.de/
LinkLabel1.Links.Add(6, 4, "http://www.123.de/")
End Sub

'TODO: Erzeugt einen Kalender
Private Sub LinkLabel1_LinkClicked(ByVal sender As System.Object, ByVal _
e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles _
LinkLabel1.LinkClicked
System.Diagnostics.Process.Start(e.Link.LinkData.ToString())
End Sub

'TODO: Öffnet die About-Box
Private Sub Button10_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
AboutBox1.Show()
End Sub

'TODO: Schließt die Form bei Klick
Private Sub ProgrammBeendenToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ProgrammBeendenToolStripMenuItem.Click
Me.Close()
End Sub

'TODO: Öffnet einen Color-Dialog
Private Sub VIPReportToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VIPReportToolStripMenuItem.Click
form_grafik.Show()
End Sub

'TODO: Öffnet die Kundenliste bei Klick
Private Sub KundenlisteToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KundenlisteToolStripMenuItem.Click
form_kundenliste.Show()
End Sub

'TODO: Öffnet auch die About-Box
Private Sub VersionsinfoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VersionsinfoToolStripMenuItem.Click
AboutBox1.Show()
End Sub

'TODO: Öffnet Databinding für die Anzeige der Navi und DB-Felder
Private Sub KundenlisteBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KundenlisteBindingNavigatorSaveItem.Click
Me.Validate()
Me.KundenlisteBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me._db2_2008_02_14DataSet)

End Sub

'TODO: Öffnet die Form für Kontaktinfo
Private Sub KontakinfoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KontakinfoToolStripMenuItem.Click
Dim Anzeige As New form_kontaktinfo
Anzeige.ShowDialog()
End Sub

'TODO: Ist dies ist die Lösung für ein Refresh/Reload vom DB-Panel?
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Panel1.Refresh()

End Sub

'TODO: Refresh der Form?
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Me.Refresh()
End Sub
End Class

Form2 [form_kundenliste]: (wird geladen bei Klick auf Button in Form1 und bleibt danach aktiv auf dem Desktop); es enthält eine Eingabemaske mit entsprechenden Data-Binding zur Access-DB =>

Public Class form_kundenliste

'TODO: Öffnet Databinding für die Anzeige der Navi und DB-Felder
Private Sub KundenlisteBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles KundenlisteBindingNavigatorSaveItem.Click
Me.Validate()
Me.KundenlisteBindingSource.EndEdit()
Me.TableAdapterManager.UpdateAll(Me._db2_2008_02_14DataSet)

End Sub

'TODO: Öffnet Databinding für die Anzeige der Navi und DB-Felder
Private Sub form_kundenliste_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'TODO: Diese Codezeile lädt Daten in die Tabelle „_db2_2008_02_14DataSet.Kundenliste“. Sie können sie bei Bedarf verschieben oder entfernen.
Me.KundenlisteTableAdapter.Fill(Me._db2_2008_02_14DataSet.Kundenliste)

End Sub

'TODO: Text-Box
Private Sub VornameTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VornameTextBox.TextChanged

End Sub

'TODO: Label
Private Sub VornameLabel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

End Sub
End Class

So, lieber Martin, ich hoffe, damit kannst Du was anfangen. Hab Mitleid mit mir, dies ist mein erster Code :smile: Grundsätzlich funzt
alles, … die Listen, die Eingaben, … nur das die Daten auf
Form1 halt nicht aktuell sind, wenn man aus Form2 wieder zurück auf Form1 geht …

Liebe Grüße und Dank

Kai

Hi Martin

Danke für dein Post. Ich hab hier so ein Mini-PDF Handbuch aus
dem iNet, aber kann auch sein, dass ich das einfach falsch
verstanden habe was da steht. Ich versuche jetzt mein Prob.
genauer zu beschreiben.

Hallo nochmal!

Auch wenn der Großteil des geposteten Codes absolut nix mit dem Problem zu tun hat, hast Du doch auch die interessante Stelle gepostet.
Im Code von Form1 hast Du doch schon (sogar kommentiert!) die Zeile, die Daten in die Tabelle „Kundenliste“ lädt:
[…]

'TODO: Diese Codezeile lädt Daten in die Tabelle
„_db2_2008_02_14DataSet.Kundenliste“.
'Sie können sie bei Bedarf verschieben oder entfernen.

Me.KundenlisteTableAdapter.Fill(Me._db2_2008_02_14DataSet.Kundenliste)

[…]

Wenn Du also einfach dann, wenn der Timer feuert, nochmal KundenlisteTableAdapter.Fill(…) aufrufst, wird der Inhalt der gebundenen DataTable aktualisiert.

Über das Design, alle 2 Sekunden die Tabelle zu holen, lässt sich streiten (nein, eigentlich nicht - das ist bäh!), aber im Rahmen dieses offensichtlichen Spielprojekts lass’ ich es mal durchgehen :wink:.

Gruß,
Martin

1 Like