none
Listbox Datensatz erneuern per Buttonklick RRS feed

  • 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
    Samstag, 17. März 2012 14:52

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
    Samstag, 17. März 2012 15:22
  • 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
    Sonntag, 18. März 2012 05:24
  • Danke, aber ich habe das ganze nun auf einer Form mit eigen definierten DataTable umgesetzt ^^
    Donnerstag, 22. März 2012 08:27

Alle Antworten

  • Also wenn du Form2 aus Form1 aufrufst, kannst du ja das Close-Event von form2 abfangen.

    Koopakiller - http://koopakiller.ko.ohost.de/

    Samstag, 17. März 2012 15:14
    Moderator
  • 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
    Samstag, 17. März 2012 15:22
  • 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
    Samstag, 17. März 2012 15:45
  • 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/

    Samstag, 17. März 2012 16:56
    Moderator
  • 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
    Samstag, 17. März 2012 17:45
  • Ich bin noch recht neu mit C# und hab daher viel klicki-bunti gemacht.

    Wo finde ich denn die DataBind Methode ^^" Sry aber bin noch nicht so gut und tu mich oft schwer mit dem verstehen was ihr sagt *schäm*

    Samstag, 17. März 2012 23:13
  • 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
    Sonntag, 18. März 2012 05:24
  • Irgendwie bekommen ich das nicht hin, könntest du mir ein Beispiel fürs DataBinding nutzen liefern?
    Sonntag, 18. März 2012 17:57
  • Kannst Du bitte mal genauer spezifizieren, was Dir in der Hilfe unklar ist, z.B. mit einem kleinen eigenen Programm.
     
    --
    Viele Gruesse
    Peter
    Sonntag, 18. März 2012 19:27
  • 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 :/

    Sonntag, 18. März 2012 20:24
  • 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
    Sonntag, 18. März 2012 20:56
  • Und wie setze ich das ganze ohne Designer um?

    Ich habe hier leider absolut keinen Ansatz :(

    Montag, 19. März 2012 06:30
  • Meng Chan:

    Bist Du sicher das die Daten in Deine Datenbank überhaupt geschrieben werden?

    Grüße

    Montag, 19. März 2012 07:07
  • Hallo, ja, beim Programmneustart tauchen die Neu hinzugefügten Namen in der ListBox auf.
    Montag, 19. März 2012 07:17
  • 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

    Montag, 19. März 2012 07:23
  • Wenn ich den Currency Manager verwende äre das bei meinem Beispiel:

    CurrencyManager cm = (CurrencyManager)this.BindingContext[datenUebertragenDataSet];           

    cm.Refresh();


    oder?

    Montag, 19. März 2012 07:42
  • 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

    Montag, 19. März 2012 08:07
  • o laut VS sthet bei der Listbox eine Source namens
    ansprechpartnerBindingSource
    Leider bleibt alles wie es ist, keine Fehlermeldung, Daten werden in Datenbank gespeichert, aber nicht aktualisiert, außer ich schlißee und öffne das Programm.
    Montag, 19. März 2012 08:20
  • Ich hatte da mal ein ähnliches Problem wie Du:

    http://social.msdn.microsoft.com/Forums/de-DE/dotnetframeworkde/thread/a42e7820-77de-4f63-8819-44d546c5f72f

    Ich hab das mal bei mir auf Listbox umgestellt und es geht:

     listBox1.DataSource = this.DbEintrag3;           

    listBox1.DisplayMember = "Datum";           

    listBox1.ValueMember = "Id";

    und dann noch:

                ((CurrencyManager)BindingContext[this.listBox1.DataSource, ""]).Refresh();

    Zeig mir mal Deinen Code wie er aussieht jetzt und wo das Currency aufgerufen wird.

    Montag, 19. März 2012 08:42
  • 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();
            }
        }
    }

    Montag, 19. März 2012 09:11
  • Ich glaub das Problem liegt daran das wir verschiedene DataSources haben.

    evtl. reicht Dir schon ein:  

    aktuelleForm.ansprechpartnerTableAdapter.Update(this.datenUebertragenDataSet.Ansprechpartner);
    Montag, 19. März 2012 09:54
  • Leider nicht, gleiches Problem :/
    Montag, 19. März 2012 10:37
  • Ich hab mal so ein ähnliches Projekt wie Du gemacht, bei mir funktioniert das sogar schon mit:

    try           

    {               

    aktuelleForm.datenUebertragenTableAdapter.FillBy(aktuelleForm.datenUebertragenDataSet.DatenUebertragen);

    }           

    catch (System.Exception ex)           

    {               

    System.Windows.Forms.MessageBox.Show(ex.Message);          

    }

    this.Close();

    direkt nach dem Aufruf der SQL_Anweisung

    Montag, 19. März 2012 12:14
  • 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.

    Montag, 19. März 2012 12:20
  • Leider wieder negativ :(
    Montag, 19. März 2012 13:06
  • kannst ja noch mal den gesammten code posten oder mir ne email schicken und ich schau mir das mal heut abend an.


    • Bearbeitet sleepy007 Freitag, 23. März 2012 09:42
    Dienstag, 20. März 2012 06:24
  • Danke, aber ich habe das ganze nun auf einer Form mit eigen definierten DataTable umgesetzt ^^
    Donnerstag, 22. März 2012 08:27