none
Textbox-Datenbindung an Variable RRS feed

  • Frage

  • Ich kann eine Textbox an eine Variable binden mit

    tb1.DataBindings.Add(New Binding("Text", Settings.intX, ""))

    und bekomme den Wert von Settings.intX auch in der Textbox angezeigt. Aber Änderungen in der Textbox werden nicht zur Variablen zurück geschrieben. Was fehlt?

    Gruß,

    WiWo

    Sonntag, 4. November 2012 22:35

Antworten

  • Mit einer einfachen Demo funktioniert das problemlos:
     
    Public Class Form1
     
      Private tb1 As New TextBox With {.Top = 10}
     
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.AddRange(New Control() {tb1})
        Dim Settings As New clsSettings
        tb1.DataBindings.Add(New Binding("Text", Settings, "intX"))
     
      End Sub
     
    End Class
     
    Class clsSettings
      Public Property intX As Integer = 55
    End Class
     
    --
    Viele Gruesse
    Peter
    • Als Antwort markiert WiWo Montag, 5. November 2012 17:08
    Montag, 5. November 2012 14:33

Alle Antworten

  • Probier’s mal so:
     
    tb1.DataBindings.Add(New Binding("Text", My.Settings, "intX"))
     
    --
    Viele Gruesse
    Peter
    Montag, 5. November 2012 06:52
  • Hallo Peter,

    es handelt sich zwar auch um ein Einstellungsmenü, wird aber nicht über My.Settings verwaltet. Die Daten liegen in einem XML-serialisierbaren Objekt; die XML-Datei wird sowohl vom Desktop-Rechner verwendet als auch auf einem CE-Gerät.

    Die Datenanbindung an das Setup-Menüfenster kann ich natürlich jeweils ganz einzeln machen, habe aber gehofft, das über Databinding etwas einfacher gestalten zu können. So, wie ich es mache, ist es aber eine Einbahnstraße. tb1.DataBindings.Add(New Binding("Text", Settings, "intX")) geht gar nicht.

    Alternativ überlege ich mir, ob ich die Settings nicht doch als eine Zeile mit vielen Spalten in eine DataTable schreiben sollte; die kann ich auch als XML speichern und laden und hab auf jeden Fall volle Binding-Möglichkeiten.

    Was sind da die üblichen Lösungen?

    Gruß,

    WiWo

    Montag, 5. November 2012 10:26
  • Wenn Settings das aus der Deserialisierung der XML-Daten erzeugte Objekt ist und intX die entsprechende Eigenschaft ist, dann muss das funktionieren.
     
    --
    Viele Gruesse
    Peter
    Montag, 5. November 2012 10:50
  • Hallo Peter,

    leider ist es so:

    tb1.DataBindings.Add(New Binding("Text", Settings.intX, ""))

    funktioniert, aber nur in eine Richtung (Änderungen in der TextBox werden nicht zurück an Settings.intX übertragen)

    tb1.DataBindings.Add(New Binding("Text", Settings,"intX"))

    macht eine Fehlermeldung "Eigenschaft intX kann nicht an .. gebunden werden". Die Fehlermeldung kommt erst beim Aufruf des Formulars über ShowDialog().

    ---

    Aber was hältst Du von der Variante mit der DataTable?

    Gruß,

    WiWo

    Montag, 5. November 2012 11:49
  • Ich würde da erst einmal den Code anschauen und überprüfen, warum der Fehler kommt. Vielleicht ist es ein ReadOnly?
     
    --
    Viele Gruesse
    Peter
    Montag, 5. November 2012 12:12
  • es ist definitiv kein RO.

    Wenn ich

    tb1.DataBindings.Add(New Binding("Text", Settings.intX, ""))

    verwende, kann ich auch per Validated-Event der Textbox den Wert von Settings.intX setzen. Aber wenn ich das bei allen 95 Settings immer noch machen muss, kann ich mir das Binding auch ganz sparen.

    Die Variante

    tb1.DataBindings.Add(New Binding("Text", Settings,"intX"))

    löst eine Argument-Exception aus, deren genauer Text ist: "An die Eigenschaft oder Spalte intX für die DataSource kann nicht gebunden werden. Parametername: dataMember"

    Gruß,

    WiWo


    • Bearbeitet WiWo Montag, 5. November 2012 14:24
    Montag, 5. November 2012 12:42
  • Mit einer einfachen Demo funktioniert das problemlos:
     
    Public Class Form1
     
      Private tb1 As New TextBox With {.Top = 10}
     
      Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Controls.AddRange(New Control() {tb1})
        Dim Settings As New clsSettings
        tb1.DataBindings.Add(New Binding("Text", Settings, "intX"))
     
      End Sub
     
    End Class
     
    Class clsSettings
      Public Property intX As Integer = 55
    End Class
     
    --
    Viele Gruesse
    Peter
    • Als Antwort markiert WiWo Montag, 5. November 2012 17:08
    Montag, 5. November 2012 14:33
  • Danke, das hat mir auf die Sprünge geholfen.

    Der kleine Unterschied liegt in Property; mit einer einfachen Public Variablen in clsSettings kommt der Fehler.

    Gruß,

    WiWo.

    Montag, 5. November 2012 17:07
  • Vergiss besser öffentliche globale Variablen. Sie werden praktisch nicht benötigt. Öffentlich sollten nur Eigenschaften, Methoden und Ereignisse sein.
     
    --
    Viele Gruesse
    Peter
    Montag, 5. November 2012 18:43
  • Das war jetzt vielleicht ein Missverständnis. Ich meinte keine globalen Variable, wie man sie vielleicht in einem Modul vereinbaren könnte, sondern nicht als Property aber als Publicc gekennzeichnete Objektdaten. Mir ist in diesem Zusammenhang die bei VS verwendete Nomenklatur auch nicht klar.

    Bei dieser Klassendefinition bestehend nur aus:

    Public Class clsSettings
      Public intX As Integer = 1
      Public Property intY  As Integer = 1
    End Class

    Was ist der Unterschied zwischen intX und intY? Und wird intX auch als Property bezeichnet oder als Variable oder als was?

    Montag, 5. November 2012 19:41
  • intX ist im vorliegenden Fall eine öffentliche (public) Variable, im englischen “Field”. Leider gibt es keine zweifelsfreie Übersetzung ins Deutsche für “Field”.
     
    Auch gibt es keine globalen Variablen im .NET. Ein VB-Modul ist eine statische Klasse und alle Member darin sind automatisch statisch (Shared) und können deshalb “global” genutzt werden (ohne Objektinstanz). Auch ist “Member” wieder ein englischer Begriff, für den es mir schwerfällt, einen zweifelsfreien deutschen Begriff zu finden.
     
    --
    Viele Gruesse
    Peter
    Dienstag, 6. November 2012 05:58