Announcement

Collapse
No announcement yet.

Frage zum Artikel: Mysterium BindingContext aus Heft 10.2006

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Frage zum Artikel: Mysterium BindingContext aus Heft 10.2006

    Hallo!

    Dieser Artikel hat für mich sehr viel mehr Licht in die Datenbindung gebracht, obwohl ich schon viele Artikel über dieses Thema genossen hatten.

    Ich habe hierzu jedoch noch eine Frage:

    Im Beispiel "Datenbindung Minimal" (die VS2003-Version) wurde eine TextBox an ein Array von TextBoxen gebunden.
    Wenn jetzt direkt Daten in die Input-Textbox z.B. textBoxList_1 eingegeben werden und dieses ist auch zur Anzeige in der textBoxOutputList ausgewählt, so werden die Daten nicht direkt angezeigt. Erst nachdem der "Datensatz" einmal gewechsel wurde oder das Registerblatt gewechselt wurde, werden richtige Daten angezeigt.
    Dieses Verhalten weicht von dem in Registerblatt 1 dargestellte Beispiel ab.

    Was ist der Grund für das Verhalten?
    Gibt es eine Lösung für das Problem?

    mfg
    Thomas

  • #2
    Hallo,
    das geschilderte Verhalten ist in der Voreinstellung wirksam, da das Interface <b>IEditableObject</b> einen Transaktionsmechanismus für den Weg »Benutzeroberfläche -> Datenquelle (DataTable)« vorsieht. Erst dann, wenn die IEditableObject-Methode <b>EndEdit</b> aufgerufen wird (was beim Wechsel zu einem anderen Datensatz automatisch passiert), werden die Werte aus der TextBox in die Datenquelle "TextBox" übernommen. Beim .NET Framework 2.0 stellt die BindingSource-Komponente die Methode <b>EndEdit</b> einsatzbereit zur Verfügung, in .NET 1.x muss man dazu den zuständigen CurrencyManager abrufen.

    Wenn dieser Transaktionsmechanismus nicht erwünscht wird, kann dieser über die Option <b>DataSourceUpdateMode</b> umgangen werden, wenn dort der Wert <b>OpPropertyChanged</b> gesetzt wird. Das folgende Beispiel aktualisiert die beiden TextBoxen in beiden Richtungen synchron. Um an das benötigte Ereignis <b>BindingComplete</b> zu gelangen, schaltet das Beispiel zwischen die beiden TextBox-Instanzen eine BindingSource:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: teal;">BindingSource</span> aBS;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> Form1_Load(<span style="color: blue;">object</span> sender, <span style="color: teal;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBS = <span style="color: blue;">new</span> <span style="color: teal;">BindingSource</span>();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBS.BindingComplete += <span style="color: blue;">new</span> <span style="color: teal;">BindingCompleteEventHandler</span>(aBS_BindingComplete);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aBS.DataSource = textBox1;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// DataSourceUpdateMode.OnPropertyChanged: Änderungen werden sofort wirksam</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; textBox2.DataBindings.Add(<span style="color: maroon;">"Text"</span>, aBS, <span style="color: maroon;">"Text"</span>, </p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">false</span>, <span style="color: teal;">DataSourceUpdateMode</span>.OnPropertyChanged); </p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">void</span> aBS_BindingComplete(<span style="color: blue;">object</span> sender, <span style="color: teal;">BindingCompleteEventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: teal;">DataRowView</span> aDRV = (<span style="color: teal;">DataRowView</span>)aBS.Current;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (aDRV != <span style="color: blue;">null</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// DataSourceUpdateMode.OnPropertyChanged sichtbar machen</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aDRV.EndEdit();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div&gt

    Comment


    • #3
      Hallo!

      Danke zunächst.

      Das mit der Transaktion habe ich glaub ich verstanden. Aber in Ihrem Beispiel auf Registerblatt "Die anhänglichen Texte" im Projekt Datenbindung 1 unter VS2003 aus der .net-Zeitschrift wird das Ausgabefeld sofort aktuallisiert wenn eine Eingabe in das Input-Feld erfolgt.
      Hingegen im Beispiel auf dem Registerblatt "Der virtuelle Datensatzzeiger" wird der Output-Text nicht geändert wenn eine Eingabe im Input-Textfeld erfolgt.
      Nur wenn z.B. das Registerblatt gewechselt wird erfolgt eine Aktuallisierung.

      Das Transaktionsverhalten ist zwischen Eingabe- und Ausgabe-Feld genau wie im ersten Registerbaltt zu beobachten.

      Warum ist das so?

      mfg
      Thomas Sparenber

      Comment


      • #4
        Hallo,
        auch auf dem 1. Registerblatt mit den beiden einzelnen Textboxen gibt es dieses unterschiedliche Verhalten. Wenn in der linken TextBox etwas eingetragen wird, ist jedes Zeichen sofort in der rechten TextBox sichtbar. Wird die Änderung jedoch in der rechten TextBox vorgenommen, ändert die linke TextBox erst dann den dargestellten Inhalt, wenn der Fokus (TAB-Taste) auf die CheckBox gelegt wird.

        Während auf dem 1. Registerblatt die beiden Textboxen direkt miteinander verbunden werden, aktiviert das 2. Registerblatt die Bindung an ein Array von TextBoxen. Somit unterscheiden sich die Fähigkeiten, da im Fall des Arrays nicht die gleiche Menge von an der Datenbindung beteiligten Interfaces hinter den Kulissen implementiert werden.

        Für die reine Anzeige (Read-Only) reicht es aus, wenn die angebundene Objektinstanz nur das Interface <i>IEnumerable</i> implementiert. Zusätzlich können die folgenden bei der Datenbindung beteiligten Interfaces <b>optional</b> implementiert werden: <i>IEnumerator, ICollection, IList, IListSource, ITypedList, IBindingList, IBindingListView, ICancelAddNew, IRaiseItemChangeEvents, IEditableObject, INotifyPropertyChanged, IDataErrorInfo, ICustomTypeDescriptor, ISupportInitialize, ISupportInitializeNotification</i> und <i>ICurrencyManagerProvider</i>.

        Vergleicht man das Verhalten von zwei unterschiedlichen "Datenquellen", so entscheidet die Menge der tatsächlich implementierten Interfaces über das konkrete Verhalten

        Comment


        • #5
          Hallo!

          Leider verstehe ich nicht ganz was Sie damit sagen wollen.

          Ich verstehe Ihre Aussagen so:

          Abschnitt 1: Ist OK und kann ich im Beispiel nachvollziehen.

          Abschnitt 2 bis zum Ende:
          Ich versehe Sie so, dass hier nicht eine einfache Textbox sondern eine Array gebunden wird und dadurch ein anderes Verhalten bei Änderungen IM ARRAY gegeben ist, gegenüber des Textfeldbeispiels.
          Mit dem Ergebnis das eine Eingabe im TextfeldArray sich nicht auf das gebundene Textfeld auswirkt.
          Die Aktuallisierung der Array-Daten mit den Daten aus der Textbox erfolgt nach dem gleichen Prinzip (Transaktion) wie beim reinen Textfeldbeispiel.

          Ein derartiges Verhalten finde ich aber nicht so besonders gelungen.
          Das bedeutet ja: Führe ich im Array eine Änderung durch, so werden die Textfelder nicht aktuallisiert sondern erst wenn sie neu "geladen" oder das Fenster neu aufgerufen wird.

          Habe ich somit richtig verstanden?

          Ich bedanke mich nochmal für Ihre Erklärungen!!

          mfg
          Thomas Sparenber

          Comment


          • #6
            Hallo,

            &gt;Ein derartiges Verhalten finde ich aber nicht so besonders gelungen.

            das Beispiel, dass eine TextBox an ein Array von TextBoxen gebunden wird, soll nur die Flexibilität des Ganzen demonstrieren. In der Praxis wird so etwas höchst selten vorkommen.

            Der Vorteil der optionalen Interfaces liegt doch gerade darin, dass auch dann ein Control gebunden werden kann, wenn dort bzw. in der Datenquelle nur ein Bruchteil der Möglichkeiten ausgenutzt wird. Wenn sich alle Controls in allen Situationen identisch verhalten sollen, müssten alle Controls bzw. alle Datenquellen auch alle Interfaces implementieren. Beim Wechsel zu einer neuen .NET-Version (mit neuen Interfaces) müssten alle alten Controls geändert werden. Die momentane Freizügigkeit bei der Wahl der implementierten Interfaces ist in der Praxis viel hilfreicher als ein strenger Ansatz

            Comment


            • #7
              Danke für die ausführlichen Auskünfte!!!

              mfg
              Thomas Sparenber

              Comment

              Working...
              X