Benutzer mit den meisten Antworten
Listbox Datensatz erneuern per Buttonklick

Frage
-
Hi,
ich komme einfach nicht mehr weiter :(
Habe eine Listbox die ich per DataBindings mit Daten aus einer .mdf fülle. Nun habe ich eine 2. Form in der ich in diese Datenbank neue Datensätze eintrage. Wenn ich nun bei dieser neuen Form auf schließen klicke sollte sich am besten die Listbox in Form 1 aktualisieren.
Kann mir hier wer einen Ansatz liefern? Wäre super nett, danke schonmal.
- Bearbeitet Meng-Chan Samstag, 17. März 2012 16:27
Antworten
-
Die einfachste Variante ist, eine gemeinsame Datenquelle in beiden Formularen zu nutzen (z.B. über einen statischen/Shared Verweis). Damit stehen die in Form2 erfassten/geänderten Daten automatisch im Form1 für eine Aktualisierung der Oberfläche bereit.--
Viele Gruesse
Peter- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:28
-
Die DataBind-Methode ist in ASP.NET-Anwendungen erforderlich, um dem System mitzuteilen, dass die Daten für das Aufbereiten des html bereitstehen.In Windows-Forms Anwendungen holt sich die Oberfläche die Daten selbst. Ein DataBind ist da nicht erforderlich. Notwendig ist bei gebundenen Daten lediglich, dass die Datenquelle dem Steuerelement bekannt ist. Dazu wird üblicherweise bei komplexer Bindung (Liste wird angezeigt) der DataSource-Eigenschaft des Steuerelementes die Verweisvariable der Datenquelle zugewiesen. Bei einfacher Bindung (z.B. TextBox) wird die DataBindings-Auflistung genutzt.In Deinem Szenario kennt Form1 die Datenquelle und teilt sie Form2 mit. Das kann man über den Konstruktor von Form2 oder über eine in Form2 eingebaute Eigenschaft machen. Möglich ist auch die Nutzung einer statischen Variablen, die von beiden Formularen genutzt wird und auf die Datenquelle verweist.Wenn der Designer zur Gestaltung der Datenquellen in den Forms genutzt wird, erzeugt er für jedes Formular eine eigene Instanz einer Datenquelle. Diesen separaten Instanzen laufen den nicht synchron und verhalten sich wie 2 getrennte Anwender/Anwendungen. Die Nutzung der gleichen datenquelle in unterschiedlichen Formularen ist nur mit zusätzlichem Kodierungsaufwand möglich.Dafür, dass Du Anfänger bist, brauchst Du Dich nicht zu schämen. Jeder war einmal Anfänger. Um stabile und fehlerfreie Programme zu erstellen, ist ein gute Portion Selbstvertrauen hilfreich.--
Viele Gruesse
Peter- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:28
-
Danke, aber ich habe das ganze nun auf einer Form mit eigen definierten DataTable umgesetzt ^^
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:28
Alle Antworten
-
Die einfachste Variante ist, eine gemeinsame Datenquelle in beiden Formularen zu nutzen (z.B. über einen statischen/Shared Verweis). Damit stehen die in Form2 erfassten/geänderten Daten automatisch im Form1 für eine Aktualisierung der Oberfläche bereit.--
Viele Gruesse
Peter- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:28
-
Ich dachte eig. ich hätte schon eine gemeinsame Datenquelle ^^"
Bei meinem Beispiel geht es um Ansprechpartner.
Diese haben Die Datenquelle medaillenpoolDataSet.
In die Datenbank wird geschrieben, und dann die form für das hinzufügen wird geschlossen, nur wie bekomme ich es genau hin dass ich dann beim schließen auch die ListBox aktualisiert bekommen. Dort werden die neuen Werte erst eingetragen, wenn ich das Programm geschlossen und neu geöffnet habe-
- Bearbeitet Meng-Chan Samstag, 17. März 2012 16:28
-
Wie gesagt, hier mal noch ein Schnippsel, wie ich es gemacht hätte:
Form2 frm = new Form2()
static void StartForm2();
{ frm.FormClosing += new FormClosingEventHandler(frm_FormClosing); frm.ShowDialog(); } public static void frm_FormClosing(object sender, FormClosingEventArgs e) { string name = frm.textBoxName.Text;
string legion = frm.textBoxLegion.Legion;
//Weiterverarbeitung }
Koopakiller - http://koopakiller.ko.ohost.de/
-
Es sollte eigentlich auch möglich sein, beim Click_Event des Hinzufügen Buttons am schluss , nach dem Speichern in der Datenbank, die DataBind() Methode der ListBox aufzurufen. Diese sollte dann die aktualisierten Werte anzeigen.
- Bearbeitet Lennart F Samstag, 17. März 2012 17:46 Tippfehler
-
Die DataBind-Methode ist in ASP.NET-Anwendungen erforderlich, um dem System mitzuteilen, dass die Daten für das Aufbereiten des html bereitstehen.In Windows-Forms Anwendungen holt sich die Oberfläche die Daten selbst. Ein DataBind ist da nicht erforderlich. Notwendig ist bei gebundenen Daten lediglich, dass die Datenquelle dem Steuerelement bekannt ist. Dazu wird üblicherweise bei komplexer Bindung (Liste wird angezeigt) der DataSource-Eigenschaft des Steuerelementes die Verweisvariable der Datenquelle zugewiesen. Bei einfacher Bindung (z.B. TextBox) wird die DataBindings-Auflistung genutzt.In Deinem Szenario kennt Form1 die Datenquelle und teilt sie Form2 mit. Das kann man über den Konstruktor von Form2 oder über eine in Form2 eingebaute Eigenschaft machen. Möglich ist auch die Nutzung einer statischen Variablen, die von beiden Formularen genutzt wird und auf die Datenquelle verweist.Wenn der Designer zur Gestaltung der Datenquellen in den Forms genutzt wird, erzeugt er für jedes Formular eine eigene Instanz einer Datenquelle. Diesen separaten Instanzen laufen den nicht synchron und verhalten sich wie 2 getrennte Anwender/Anwendungen. Die Nutzung der gleichen datenquelle in unterschiedlichen Formularen ist nur mit zusätzlichem Kodierungsaufwand möglich.Dafür, dass Du Anfänger bist, brauchst Du Dich nicht zu schämen. Jeder war einmal Anfänger. Um stabile und fehlerfreie Programme zu erstellen, ist ein gute Portion Selbstvertrauen hilfreich.--
Viele Gruesse
Peter- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:28
-
Ok, ich versuche es ^^
Habe Form1:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace DatenUebertragen { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: Diese Codezeile lädt Daten in die Tabelle "datenUebertragenDataSet.Ansprechpartner". Sie können sie bei Bedarf verschieben oder entfernen. this.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner); } private void btn_lebe_hinzufuegen_Click(object sender, EventArgs e) { Form2 hinzufuegen = new Form2(this); hinzufuegen.Show(); } } }
und Form 2:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace DatenUebertragen { public partial class Form2 : Form { Form1 aktuelleForm; public Form2(Form1 alteForm) { InitializeComponent(); aktuelleForm = alteForm; } private void Form2_Load(object sender, EventArgs e) { // TODO: Diese Codezeile lädt Daten in die Tabelle "datenUebertragenDataSet.Lernkreis". Sie können sie bei Bedarf verschieben oder entfernen. this.lernkreisTableAdapter.Fill(this.datenUebertragenDataSet.Lernkreis); } private void btn_ansprech_hinzu_speichern_Click(object sender, EventArgs e) { SqlConnection oleConn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Meng\Documents\Visual Studio 2010\Projects\DatenUebertragen\DatenUebertragen\DatenUebertragen.mdf;Integrated Security=True;User Instance=True"); string strSQL = "INSERT INTO Ansprechpartner (Name, FSLID) VALUES ('" + txtbox_ansprech_hinzu_name.Text + "', " + nameComboBox.SelectedValue.ToString() + ")"; SqlCommand SQLState = new SqlCommand(strSQL, oleConn); oleConn.Open(); SQLState.ExecuteReader(); oleConn.Close(); aktuelleForm.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner); this.Close(); } private void btn_ansprech_hinzu_abbrechen_Click(object sender, EventArgs e) { this.Close(); } } }
Und dachte nun mit dem
aktuelleForm.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner);
Würde ich die ListBox dann aktuallisiert bekommen, aber ich versteh nicht ganz, was das Databinding der Formen damit zu tun hat :(
Habe ja selber keine Bindings programmiert, da ich das alles in VS zusammengeklickt habe :/
-
Schau Dir mal den vom Designer generierten Code an. Du hast zwei Instanzen für den Datenzugriff (resp. Datenquelle), die wie zwei Anwender bzw. Anwendungen unabhängig voneinander agieren. Um eine synchrone Arbeitsweise zu erzielen, musst Du auf die Designer verzichten, wenigstens teilwiese.--
Viele Gruesse
Peter -
OK,
für´s update gibt es noch den Currency Manager:
http://msdn.microsoft.com/de-de/library/system.windows.forms.currencymanager%28v=vs.80%29.aspx
Grüße
-
Beim Beispiel steht ja eigentlich das DataTable in der eckigen Klammer,
probier´s doch einfach aus.
Für meine ComboBoxen benutze ich folgenden Code:
((CurrencyManager)BindingContext[this.comboBox1.DataSource, ""]).Refresh();
Deine Listbox hat aber glaube ich keine DataSource, das muß bei Dir glaub etwas anders geschrieben werden.
Grüße
-
Ich hatte da mal ein ähnliches Problem wie Du:
Ich hab das mal bei mir auf Listbox umgestellt und es geht:
und dann noch:listBox1.DataSource = this.DbEintrag3;
listBox1.DisplayMember = "Datum";
listBox1.ValueMember = "Id";
((CurrencyManager)BindingContext[this.listBox1.DataSource, ""]).Refresh();
Zeig mir mal Deinen Code wie er aussieht jetzt und wo das Currency aufgerufen wird.
-
Hier der Code:
Form1:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace DatenUebertragen { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // TODO: Diese Codezeile lädt Daten in die Tabelle "datenUebertragenDataSet.Ansprechpartner". Sie können sie bei Bedarf verschieben oder entfernen. this.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner); // TODO: Diese Codezeile lädt Daten in die Tabelle "datenUebertragenDataSet.Ansprechpartner". Sie können sie bei Bedarf verschieben oder entfernen. this.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner); } private void btn_lebe_hinzufuegen_Click_1(object sender, EventArgs e) { Form2 hinzufuegen = new Form2(this); hinzufuegen.Show(); } } }
Form2:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace DatenUebertragen { public partial class Form2 : Form { Form1 aktuelleForm; public Form2(Form1 alteForm) { InitializeComponent(); aktuelleForm = alteForm; } private void Form2_Load(object sender, EventArgs e) { // TODO: Diese Codezeile lädt Daten in die Tabelle "datenUebertragenDataSet.Ansprechpartner". Sie können sie bei Bedarf verschieben oder entfernen. this.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner); // TODO: Diese Codezeile lädt Daten in die Tabelle "datenUebertragenDataSet.Lernkreis". Sie können sie bei Bedarf verschieben oder entfernen. this.lernkreisTableAdapter.Fill(this.datenUebertragenDataSet.Lernkreis); } private void btn_ansprech_hinzu_abbrechen_Click(object sender, EventArgs e) { this.Close(); } private void btn_ansprech_hinzu_speichern_Click_1(object sender, EventArgs e) { SqlConnection oleConn = new SqlConnection(@"Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Projekte\DatenUebertragen\DatenUebertragen\DatenUebertragen.mdf;Integrated Security=True;User Instance=True"); string strSQL = "INSERT INTO Ansprechpartner (Name, FSLID) VALUES ('" + txtbox_ansprech_hinzu_name.Text + "', " + nameComboBox.SelectedValue.ToString() + ")"; SqlCommand SQLState = new SqlCommand(strSQL, oleConn); oleConn.Open(); SQLState.ExecuteReader(); oleConn.Close(); //aktuelleForm.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner); aktuelleForm.nameListBox.DataSource = aktuelleForm.ansprechpartnerBindingSource; aktuelleForm.nameListBox.DisplayMember = "Name"; aktuelleForm.nameListBox.ValueMember = "AID"; ((CurrencyManager)BindingContext[this.aktuelleForm.nameListBox.DataSource, ""]).Refresh(); this.Close(); } } }
-
Ich hab mal so ein ähnliches Projekt wie Du gemacht, bei mir funktioniert das sogar schon mit:
direkt nach dem Aufruf der SQL_Anweisungtry
{
aktuelleForm.datenUebertragenTableAdapter.FillBy(aktuelleForm.datenUebertragenDataSet.DatenUebertragen);
}
catch (System.Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
}
this.Close();
-
mach mal folgendes wieder rein
//aktuelleForm.ansprechpartnerTableAdapter.Fill(this.datenUebertragenDataSet.Ansprechpartner);
und ändere es ab in:
aktuelleForm.ansprechpartnerTableAdapter.Fill(aktuelleForm.datenUebertragenDataSet.Ansprechpartner
und laß das andere Sach wieder weg.
-
Danke, aber ich habe das ganze nun auf einer Form mit eigen definierten DataTable umgesetzt ^^
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 23. März 2012 16:28