Databinding



  • Hallo!

    Ich versuche eine Datenanbindung an eine normale Textbox. Jedoch gleichgültig was ich auch anstelle, das Control wird einfach nicht mit dem inhalt des ausgewählten Feldes geladen.

    Nachfolgende Beschreibung ist der letzte Stand meiner Versuche, vielleicht hat jemand von Euch eine Idee, was ich denn falsch mache:

    _myDataSet = new MyDataSet(); // typisierter Dataset
    SqlConnection connection =	new SqlConnection("MyConnectionString");
    connection.Open();
    using(SqlCommand cmd = new SqlCommand("select * from myTable where table_id = 1", connection))
    {
    	SqlDataAdapter adapter = new SqlDataAdapter();
    	adapter.SelectCommand = cmd;
    	adapter.Fill(_myDataSet, "myTable"); // eine row ist geladen
    }
    

    Es wird auch eine Row geladen!!! Die Datenanbindung an das Control habe ich über die Designerproperty Databindings/Tag an eine bestimmte Spalte (sagen wir "y_name" vorgenommen, so daß folgender Code in der Designer-Datei erzeugt worden ist:

    this.myTableBindingSource = new System.Windows.Forms.BindingSource(this.components);
    ((System.ComponentModel.ISupportInitialize)(this.myTableBindingSource)).BeginInit();
    this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Tag", this.myTableBindingSource, "y_name", true));
    
    this.personBindingSource.DataMember = "myTable";
    this.personBindingSource.DataSource = this._myDataSet;
    
    ((System.ComponentModel.ISupportInitialize)(this.personBindingSource)).EndInit();
    

    Danke schon mal 🙂



  • Wieso hast Du das an das Tag-Property gebunden? Das muss doch an Text bei einer Textbox.



  • Auch wenn ich an das Text.Property binde geschieht nichts! Liegt es vielleicht daran, daß ein DataTable mehr als nur eine Row beinhalten kann?

    Bei meinem Beispiel allerdings, habe ich im DataTable nur eine einzige Row. Es ist zum verzweifeln ... 😞



  • Setze mal ne BindingSource dazwischen (und noch ein BindingNavigator dazu, damit Du navigieren kannst.)



  • Knuddlbaer schrieb:

    Setze mal ne BindingSource dazwischen (und noch ein BindingNavigator dazu, damit Du navigieren kannst.)

    Die hat er doch schon drin. Kannst Du mal versuchen:
    - eine Datagridview zu nehmen, ob die Daten darstellt, (dort die bindingSource in DataSource angeben)
    - nicht nur eine, sondern mehrere Rows zu laden und dann mit dem BindingNavigator durchlaufen, ob er sich beim Laden der ersten Row sich 'verschluckt'



  • Kannst Du weiterhin mal prüfen:
    - ist _myDataSet in beiden Sourcecodeabschnitten wirklich dasselbe Objekt? Hat der Designer das angelegt?
    - BindingSource::ResetBindings() mal probieren.



  • Also ich habe den generierten Code von

    textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._myDataSet, "myTable.MY_FIELD", true));
    

    nach

    textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this._myDataSet.myTable[0], "MY_FIELD", true));
    

    nachgebessert und jetzt funktioniert es. Aber es kann doch nicht sein, daß man bei einer solchen eine Datenanbindung, wenn sie auch automatisch vom VS-Studio unterstützt wird, selbst coden muß.

    Kann der Studio-Designer hierfür keinen automatischen Code erzeugen :?



  • Eigentlich schon, jedenfalls hatte ich mit Bindings erstellt durch "Zusammenklickern" noch keine Probleme.



  • Wenn man ein Control an eine Tabellen(!)palte(!) bindet, so wie es im Designer ja geschieht, ist der generierte Code ja erwartungsgemäß.

    Ich will ja die erste Row der Spalte an das Control binden! Gibt es hierfür keinen Automatismus über den Designer?



  • Nein, warum sollte es das auch ?



  • Knuddlbaer schrieb:

    Nein, warum sollte es das auch ?

    ... weil es gängige Art einer Codemusetzung ist.



  • Wenn man ein Element an eine Datenbank anbindet, wie Warscheinlich ist es, das man den ersten Datensatz - und nichts als den ersten Datensatz anzeigen möchte ?

    Das gewünschte Ergebnis kann doch über einen kleinen Umweg des BindingSource erreicht werden. Den kann man dann auf ein beliebigen Datensatz springen lassen. Lässt man den Navigator weg, ist die Vorgabe fix.

    Oder anders ausgedrückt:

    Es interessiert mich warum es eine übliche Codeumsetzung ist eine Datenbank zu verwenden wenn ich nur den ersten Datensatz anzeigen möchte. Das ist jetzt nicht böse, als Flame oder sonst was gemeint sondern als ehrliche Frage aus Interesse.



  • _myDataSet = new MyDataSet(); // typisierter Dataset
    SqlConnection connection =	new SqlConnection("MyConnectionString");
    connection.Open();
    using(SqlCommand cmd = new SqlCommand("select * from myTable where table_id = 1", connection))
    {
    	SqlDataAdapter adapter = new SqlDataAdapter();
    	adapter.SelectCommand = cmd;
    	adapter.Fill(_myDataSet, "myTable"); // eine row ist geladen
    }
    

    Der Designer ist schon in Ordnung. Nicht in Ordnung aber ist die erste Zeile Deines Codes. Kommentier sie doch mal spaßhalber aus...


Anmelden zum Antworten