DataBinding in .NET...wer weiss Rat?
-
Hi,
dieses DataBining macht nur Probleme. Weiss jemand gute Web Ressourcen, mit Artikeln dazu? In der MSDN habe ich einiges gefunden, aber wenn man leicht anders vorgehen muss, als dort vorgeschrieben, dann klappt es oftmlas nicht.Mein Problem ist, dass ích in einem Form Daten aus 4 verschiedenen, miteinander verknüpften Tabellen anzeige. Diese Daten sollen nach Möglichkeit auch zusammen "geupdatet" werden. Nur kommt da nicht anständiges bei heraus.
Ich habe die BinidingSources geprüft, die scheinen alle Korrekt zu sein, tortzdem stets folgendes Verhalten:
Der Datensatz wird geladen, die Daten aus zwei der Tabellen werden auch richtig angezeigt, eine Tabelle schiesst allerdings quer. Ich kann dort keine neuen Daten hineinschreiben (zumindest nicht über das Form, aus dem Programm heraus schon), egal was ich mache. Sobald ich die Daten an die DB zum Speichern sende, sind alle manuell befüllten Felder wieder leer, in der DB wurde auch nichts davon eingetragen.
Die Binding Source sieht wie folgt aus:
(generalAdvice ist der Tabellenname)generalAdviceBindingSource.DataMember = "FK_GeneralAdvice_Contacts"; // die darüberliegende Tabelle generalAdviceBindingSource.DataSource = contactsBindingSource; // contacts: contactsBindingSource.DataMember = "FK_Contacts_Owners"; contactsBindingSource.DataSource = ownersBindingSource; //owners ownersBindingSource.DataMember = "Owners"; ownersBindingSource.DataSource = CM2DataSet;
Die Relationen sind wie folgt:
Owners steht in einer 1:n Relation zu den contacts, contacts steht in einer 1:1 Relation zu den generalAdvice.
-
Hmm wie ist den die ReadOnly-Eigenschfat der DataGrid gesetzt?
So muss erstmal weg Einkaufen ich gucke später nochmal vorbei.
Gruss
-
Viel Spass beim Einkaufen,
Ich verwende kein DataGrid als COntrol, nur Textboxen.
-
So erstmal wieder da!
Ahja Du verwendest also TextBoxen. Und ich nehme mal an Du hast es alles von Hand codiert.
Erstmal die schnellste Möglichkeit sehe ich in folgendem:
1. Projektexplorer aufmachen
2. Neues Element hinzufügen
3. DataForm-Assistent anklickenDieser ist sehr nützlich Er erkennt auch DataSet-Objekte die Du schon im
Projekt hast. Er baut auch Update/Laden-Funktionalität in das Formular ein.Wenn Du das machen willst kannst Du Dir dessen erzeugten Code erstmal in Ruhe angucken und nach belieben selbst anpassen.
z.B.: Form_Load des DataForm überladen und darin zu Anfang die DatenLaden-Funktionalität ausführen lassen.
Einziger Nachteil da ich annehme Du möchtest kein Grid weil Du ja Textboxen verwendest. Der Assistent macht in dieses Form ein Grid mit vollem Funktionsumfang (voll editierbar mit DB-Connectivity usw.) ins Formular.Aber Du könntest Dir ja das ganze mit:
BindingsContext
BindingsSourcevom AutoCode des Assistenten abgucken.
sclearscreen
-
Das klingt verlockend, nur scheint es bei mir (Visual Studio Professional 2005) keinen DataForm Assistant zu geben. Ich gehe auf "Neues Element hinzufügen" und bekomme da allerlei "Vorlagen" angezeigt, nur keine mit einem solchen Namen.
-
Mein Fehler ich meinet statt Element hinzufügen "Komponente Hinzufügen"
Hinzufügen->Komponente hinzügen->Im Dialog, der aufgehen wird, mal scrollen
Da sollte eine Auswahl existieren "DataForm-Assistent"
guckmal aber ich gebe zu bedenken ich sitze hier an VS 2003
ich denke es müsste auch vorhanden seinÜber dieses kontextmenü im Projektexplorer per Rechtsklick auf den Projektnamen
-
Nein, leider nicht. Ich bekomme dann lediglich das Gleiche Menu wie worher (beim Element HInzufügen, wo ich z.B. ein Form oder eine Klasse hinzufügen kann), nur dass es eine Vorauswahl auf "Komponentenklasse" gibt.
Schade, aber anscheinend hat man dieses Tool in VS 2005 entfernt.
-
ich gebe Dir mal den hauptsächlichen Quellcode aus meinem Formular
das betrifft dann das Laden als auch das Updaten:public void LoadDataSet() { // Neues DataSet erstellen, das die Datensätze enthält, die von dem Aufruf an FillDataSet zurückgegeben wurden. // Ein temporäres DataSet wird verwenden, da das Füllen eines vorhandenen DataSets // erneutes Erstellen der Datenbindungen erfordern würde. DataBindingExample.DataSet1 objDataSetTemp; objDataSetTemp = new DataBindingExample.DataSet1(); try { // Versuch, das temporäre DataSet zu füllen. objDataSetTemp = ((DataBindingExample.DataSet1)(this.objDataSet1.Clone())); } catch (System.Exception eFillDataSet) { // Fehlerbehandlungscode hier hinzufügen. throw eFillDataSet; } try { grdVokabeln.DataSource = null; // Alte Datensätze aus dem DataSet entfernen. objDataSet1.Clear(); // Datensätze im Haupt-DataSet zusammenführen. objDataSet1.Merge(objDataSetTemp); grdVokabeln.SetDataBinding(objDataSet1, "Vokabeln"); } catch (System.Exception eLoadMerge) { // Fehlerbehandlungscode hier hinzufügen. throw eLoadMerge; } } public void UpdateDataSet() { // Ein neues DataSet erstellen, das die Änderungen enthält, die im Haupt-DataSet vorgenommen wurden DataBindingExample.DataSet1 objDataSetChanges = new DataBindingExample.DataSet1(); System.Data.DataSet objDataSetUpdated = new DataBindingExample.DataSet1(); // Alle aktuellen Bearbeitungen anhalten. this.BindingContext[objDataSet1,"Vokabeln"].EndCurrentEdit(); // Änderungen abrufen, die am Haupt-DataSet vorgenommen wurden. objDataSetChanges = ((DataBindingExample.DataSet1)(objDataSet1.GetChanges())); // Prüfen, ob Änderungen durchgeführt wurden. if ((objDataSetChanges != null)) { try { // Es müssen Änderungen vorgenommen werden. Versuchen Sie, die Datenbank durch // Aufrufen der Update-Methode mit Übergabe des DataSet und anderer Parameter zu aktualisieren. objDataSetUpdated = this.objDataSet1.Clone(); } catch (System.Exception eUpdate) { // Fehlerbehandlungscode hier hinzufügen. throw eUpdate; } // Code hinzufügen, um das zurückgegebenen DataSet auf Fehler zu überprüfen, // die möglicherweise in die Error-Eigenschaft des Row-Objekts gespeichert wurden. try { objDataSet1.Merge(objDataSetUpdated); } catch (System.Exception eUpdateMerge) { // Ausnahmebehandlungscode hier hinzufügen throw eUpdateMerge; } // Commit ausführen für Änderungen, die soeben zusammengeführt wurden // Verschiebt Zeilen, die als aktualisiert, eingefügt oder verändert markiert sind so, dass sie ihre ursprünglichen Werte wieder erhalten. objDataSet1.AcceptChanges(); } }
als DataSet hat er das bei mir genommen was schon im Projekt war (DataSet1)!
-
Es ist nun so das DataGrid ist voll editierbar d.h. der User kann in das Grid gehen und Inhalt dort manipulieren. Und über 2 Button werden standardmässig obige 2 Methoden angesprochen/ausgeführt!
Zu beachten wäre in dem fall für Dich in den Methoden mit dem Aufruf von
BindingContext
Dort wo folgende Zeichenkette auftaucht:
"Vokabeln" ist der Name einer Tabelle in der Datenbank mit gemeint.
Das DataBindingExample ist der Namensraum meines Projektes!
Und das grdVokabeln ist das DataGrid im Formular.
Damit der User Änderungen rückgängig machen kann wenn er einen fehler gemacht hat
gibts dann noch auf dem Formular eine Extra Button der löst folgendes aus:private void btnCancelAll_Click(object sender, System.EventArgs e) { this.objDataSet1.RejectChanges(); }
Vielleicht kannst Du es Dir ja mal anpassen erstmal auf eine Tabelle
damit Du ein Gefühl für die Funktion bekommst, auch vielleicht wenn man mal einen Haltepunkt explizit in eine Methode setzt. Um mal das Update auszuprobieren!Gruss sclearscreen
P.S.: Ist ja soweit auch durch die Autokommentare des Assitenten gut erklärt!
-
1. Eine TextBox wurde per BindingContext gebunden
2. es existieren 2 Button mit denn switscht man durch die Datensätze was
die textbox anzeigt3. Du kannst über die eine Textbox folgendes machen:
-den aktuell angeswitschten DS editieren und per Aktualisieren-Button übernehmen
die DB nimmt es an und das GUI wird auch updatet
-Den aktuelle angeswitchten DS löschen DB und GUI werden auch wieder
aktualisiert per/über Löschen-Button
-eine Datensatz über das Textfeld einfügen auch über eine Button auch hier wird
das GUI und die DB refreschtusing System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace DataBindingExample2 { /// <summary> /// Zusammenfassung für Form1. /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Data.OleDb.OleDbDataAdapter oleDbDataAdapter1; private System.Data.OleDb.OleDbCommand oleDbSelectCommand1; private System.Data.OleDb.OleDbCommand oleDbInsertCommand1; private System.Data.OleDb.OleDbCommand oleDbUpdateCommand1; private System.Data.OleDb.OleDbCommand oleDbDeleteCommand1; private System.Data.OleDb.OleDbConnection oleDbConnection1; private System.Windows.Forms.Button btnVorheriger; private System.Windows.Forms.Button btnNaechster; private System.Windows.Forms.Label lblDsNr; private System.Windows.Forms.TextBox txtThemengebiet; private DataBindingExample2.DataSet1 dataSet11; private System.Windows.Forms.Button btnAktualisieren; private System.Windows.Forms.Button btnNeuerDatensatz; private System.Windows.Forms.Button btnLöschen; /// <summary> /// Erforderliche Designervariable. /// </summary> private System.ComponentModel.Container components = null; public Form1() { // // Erforderlich für die Windows Form-Designerunterstützung // InitializeComponent(); // // TODO: Fügen Sie den Konstruktorcode nach dem Aufruf von InitializeComponent hinzu // DatenLaden(); } /// <summary> /// Die verwendeten Ressourcen bereinigen. /// </summary> protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region Vom Windows Form-Designer generierter Code /// <summary> /// Erforderliche Methode für die Designerunterstützung. /// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden. /// </summary> private void InitializeComponent() { this.oleDbDataAdapter1 = new System.Data.OleDb.OleDbDataAdapter(); this.oleDbSelectCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbInsertCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbUpdateCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbDeleteCommand1 = new System.Data.OleDb.OleDbCommand(); this.oleDbConnection1 = new System.Data.OleDb.OleDbConnection(); this.btnVorheriger = new System.Windows.Forms.Button(); this.btnNaechster = new System.Windows.Forms.Button(); this.lblDsNr = new System.Windows.Forms.Label(); this.txtThemengebiet = new System.Windows.Forms.TextBox(); this.dataSet11 = new DataBindingExample2.DataSet1(); this.btnAktualisieren = new System.Windows.Forms.Button(); this.btnNeuerDatensatz = new System.Windows.Forms.Button(); this.btnLöschen = new System.Windows.Forms.Button(); ((System.ComponentModel.ISupportInitialize)(this.dataSet11)).BeginInit(); this.SuspendLayout(); // // oleDbDataAdapter1 // this.oleDbDataAdapter1.DeleteCommand = this.oleDbDeleteCommand1; this.oleDbDataAdapter1.InsertCommand = this.oleDbInsertCommand1; this.oleDbDataAdapter1.SelectCommand = this.oleDbSelectCommand1; this.oleDbDataAdapter1.TableMappings.AddRange(new System.Data.Common.DataTableMapping[] { new System.Data.Common.DataTableMapping("Table", "Themengebiete", new System.Data.Common.DataColumnMapping[] { new System.Data.Common.DataColumnMapping("Themengebiet", "Themengebiet")})}); this.oleDbDataAdapter1.UpdateCommand = this.oleDbUpdateCommand1; // // oleDbSelectCommand1 // this.oleDbSelectCommand1.CommandText = "SELECT Themengebiet FROM Themengebiete"; this.oleDbSelectCommand1.Connection = this.oleDbConnection1; // // oleDbInsertCommand1 // this.oleDbInsertCommand1.CommandText = "INSERT INTO Themengebiete(Themengebiet) VALUES (?)"; this.oleDbInsertCommand1.Connection = this.oleDbConnection1; this.oleDbInsertCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Themengebiet", System.Data.OleDb.OleDbType.VarWChar, 50, "Themengebiet")); // // oleDbUpdateCommand1 // this.oleDbUpdateCommand1.CommandText = "UPDATE Themengebiete SET Themengebiet = ? WHERE (Themengebiet = ?)"; this.oleDbUpdateCommand1.Connection = this.oleDbConnection1; this.oleDbUpdateCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Themengebiet", System.Data.OleDb.OleDbType.VarWChar, 50, "Themengebiet")); this.oleDbUpdateCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_Themengebiet", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "Themengebiet", System.Data.DataRowVersion.Original, null)); // // oleDbDeleteCommand1 // this.oleDbDeleteCommand1.CommandText = "DELETE FROM Themengebiete WHERE (Themengebiet = ?)"; this.oleDbDeleteCommand1.Connection = this.oleDbConnection1; this.oleDbDeleteCommand1.Parameters.Add(new System.Data.OleDb.OleDbParameter("Original_Themengebiet", System.Data.OleDb.OleDbType.VarWChar, 50, System.Data.ParameterDirection.Input, false, ((System.Byte)(0)), ((System.Byte)(0)), "Themengebiet", System.Data.DataRowVersion.Original, null)); // // oleDbConnection1 // this.oleDbConnection1.ConnectionString = @"Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source=""C:\Dokumente und Einstellungen\Christian.WORKGROU-0F4C62\Eigene Dateien\EnglischDeutsch.mdb"";Jet OLEDB:Engine Type=5;Provider=""Microsoft.Jet.OLEDB.4.0"";Jet OLEDB:System database=;Jet OLEDB:SFP=False;persist security info=False;Extended Properties=;Mode=Share Deny None;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Create System Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;User ID=Admin;Jet OLEDB:Global Bulk Transactions=1"; // // btnVorheriger // this.btnVorheriger.Location = new System.Drawing.Point(88, 64); this.btnVorheriger.Name = "btnVorheriger"; this.btnVorheriger.TabIndex = 0; this.btnVorheriger.Text = "<"; this.btnVorheriger.Click += new System.EventHandler(this.btnVorheriger_Click); // // btnNaechster // this.btnNaechster.Location = new System.Drawing.Point(256, 64); this.btnNaechster.Name = "btnNaechster"; this.btnNaechster.TabIndex = 1; this.btnNaechster.Text = ">"; this.btnNaechster.Click += new System.EventHandler(this.btnNaechster_Click); // // lblDsNr // this.lblDsNr.Location = new System.Drawing.Point(184, 64); this.lblDsNr.Name = "lblDsNr"; this.lblDsNr.Size = new System.Drawing.Size(56, 24); this.lblDsNr.TabIndex = 2; this.lblDsNr.Text = "0"; this.lblDsNr.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // txtThemengebiet // this.txtThemengebiet.Location = new System.Drawing.Point(88, 112); this.txtThemengebiet.Name = "txtThemengebiet"; this.txtThemengebiet.Size = new System.Drawing.Size(240, 20); this.txtThemengebiet.TabIndex = 3; this.txtThemengebiet.Text = ""; // // dataSet11 // this.dataSet11.DataSetName = "DataSet1"; this.dataSet11.Locale = new System.Globalization.CultureInfo("de-DE"); // // btnAktualisieren // this.btnAktualisieren.Location = new System.Drawing.Point(88, 152); this.btnAktualisieren.Name = "btnAktualisieren"; this.btnAktualisieren.Size = new System.Drawing.Size(240, 24); this.btnAktualisieren.TabIndex = 4; this.btnAktualisieren.Text = "Aktualisieren"; this.btnAktualisieren.Click += new System.EventHandler(this.btnAktualisieren_Click); // // btnNeuerDatensatz // this.btnNeuerDatensatz.Location = new System.Drawing.Point(88, 192); this.btnNeuerDatensatz.Name = "btnNeuerDatensatz"; this.btnNeuerDatensatz.Size = new System.Drawing.Size(240, 24); this.btnNeuerDatensatz.TabIndex = 5; this.btnNeuerDatensatz.Text = "Neuer Datensatz"; this.btnNeuerDatensatz.Click += new System.EventHandler(this.btnNeuerDatensatz_Click); // // btnLöschen // this.btnLöschen.Location = new System.Drawing.Point(88, 232); this.btnLöschen.Name = "btnLöschen"; this.btnLöschen.Size = new System.Drawing.Size(240, 24); this.btnLöschen.TabIndex = 6; this.btnLöschen.Text = "Datensatz Löschen"; this.btnLöschen.Click += new System.EventHandler(this.btnLöschen_Click); // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(5, 13); this.ClientSize = new System.Drawing.Size(520, 342); this.Controls.Add(this.btnLöschen); this.Controls.Add(this.btnNeuerDatensatz); this.Controls.Add(this.btnAktualisieren); this.Controls.Add(this.txtThemengebiet); this.Controls.Add(this.lblDsNr); this.Controls.Add(this.btnNaechster); this.Controls.Add(this.btnVorheriger); this.Name = "Form1"; this.Text = "Form1"; ((System.ComponentModel.ISupportInitialize)(this.dataSet11)).EndInit(); this.ResumeLayout(false); } #endregion /// <summary> /// Der Haupteinstiegspunkt für die Anwendung. /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } /* Wir Beladen oder frischen damit unser Datenfrontend auf das betrifft folgende Aktionen: -Löschen, Einfügen Editieren Aktualisieren */ private void DatenLaden() { dataSet11.Clear(); oleDbDataAdapter1.Fill(dataSet11); txtThemengebiet.DataBindings.Clear(); txtThemengebiet.DataBindings.Add("Text",dataSet11.Tables["Themengebiete"], "Themengebiet"); lblDsNr.Text = (BindingContext[dataSet11.Tables["Themengebiete"]].Position + 1).ToString() + "/" + BindingContext[dataSet11.Tables["Themengebiete"]].Count.ToString(); } private void btnVorheriger_Click(object sender, System.EventArgs e) { BindingContext[dataSet11.Tables["Themengebiete"]].Position--; lblDsNr.Text = (BindingContext[dataSet11.Tables["Themengebiete"]].Position + 1).ToString() + "/" + BindingContext[dataSet11.Tables["Themengebiete"]].Count.ToString(); } private void btnNaechster_Click(object sender, System.EventArgs e) { BindingContext[dataSet11.Tables["Themengebiete"]].Position++; lblDsNr.Text = (BindingContext[dataSet11.Tables["Themengebiete"]].Position + 1).ToString() + "/" + BindingContext[dataSet11.Tables["Themengebiete"]].Count.ToString(); } /* Jemand editiert eine Datensatz und aktualisiert dann die daten */ private void btnAktualisieren_Click(object sender, System.EventArgs e) { int PositionsMerker = BindingContext[dataSet11.Tables["Themengebiete"]].Position; try { dataSet11.Tables["Themengebiete"].BeginInit(); dataSet11.Tables["Themengebiete"].Rows[PositionsMerker]["Themengebiet"] = txtThemengebiet.Text; dataSet11.Tables["Themengebiete"].Rows[PositionsMerker].EndEdit(); DataSet ds = dataSet11.GetChanges(); // Änderungen holen dataSet11.Merge(ds); // Änderungen mit bestehenden Datenset verknüpfen /* aktualisierte Daten der Db bekanntgeben */ oleDbDataAdapter1.Update(dataSet11); dataSet11.AcceptChanges(); } catch { dataSet11.RejectChanges(); } finally { /* Unser GUI aufrischen */ DatenLaden(); } } /* Wir erzeugen einen neuen Datensatz */ private void btnNeuerDatensatz_Click(object sender, System.EventArgs e) { try { DataRow dr = dataSet11.Tables["Themengebiete"].NewRow(); dr["Themengebiet"] = txtThemengebiet.Text; dataSet11.Tables["Themengebiete"].LoadDataRow(dr.ItemArray, false); /* aktualisierte Daten der Db bekanntgeben */ oleDbDataAdapter1.Update(dataSet11); } catch { dataSet11.RejectChanges(); } finally { /* Unser GUI aufrischen */ DatenLaden(); } } private void btnLöschen_Click(object sender, System.EventArgs e) { int PositionsMerker = BindingContext[dataSet11.Tables["Themengebiete"]].Position; try { dataSet11.Tables["Themengebiete"].Rows[PositionsMerker].Delete(); oleDbDataAdapter1.Update(dataSet11); dataSet11.AcceptChanges(); } catch { dataSet11.RejectChanges(); } finally { /* Unser GUI aufrischen */ DatenLaden(); } } } }
Ich hoffe Dir hilft es als Orientierungsbeispiel!
Grüsse