Benutzer mit den meisten Antworten
Textbox-Datenbindung an Variable

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
Antworten
-
Mit einer einfachen Demo funktioniert das problemlos:Public Class Form1Private tb1 As New TextBox With {.Top = 10}Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadMe.Controls.AddRange(New Control() {tb1})Dim Settings As New clsSettingstb1.DataBindings.Add(New Binding("Text", Settings, "intX"))End SubEnd ClassClass clsSettingsPublic Property intX As Integer = 55End Class--
Viele Gruesse
Peter- Als Antwort markiert WiWo Montag, 5. November 2012 17:08
Alle Antworten
-
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
-
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
-
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
-
Mit einer einfachen Demo funktioniert das problemlos:Public Class Form1Private tb1 As New TextBox With {.Top = 10}Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadMe.Controls.AddRange(New Control() {tb1})Dim Settings As New clsSettingstb1.DataBindings.Add(New Binding("Text", Settings, "intX"))End SubEnd ClassClass clsSettingsPublic Property intX As Integer = 55End Class--
Viele Gruesse
Peter- Als Antwort markiert WiWo Montag, 5. November 2012 17:08
-
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?
-
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