Frage zu: Settings richtig verwenden + an Settings binden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Frage zu: Settings richtig verwenden + an Settings binden

    Hallo!

    Wie von EDR beschrieben, kann man mit den Settings Daten typidentisch an Control-Eigenschaften binden.
    In den Auswahlboxen der PropertyBinding, werden auch nur die zulässigen Typen aufgelistet.

    Beispiel:
    Einen Integerwert in den Settings den über eine Textbox gebunden behandeln

    VB.NET-Quellcode

    1. Me.Textbox.Text = My.Settings.Integerwert.ToString

    Kann man so was auch über einen Umweg binden, weil Intergerwert wird ja bei .Text nicht aufgelistet :?:

    Vb1963

    kein Binding, wenn Control nicht sichtbar ist

    Hallo VBP!

    Ich probierte eine ausgeblendete Textbox, die zeitweise auch einmal sichtbar ist,
    codeseitig mit Daten zu versorgen und habe festgestellt, dass die Bindung
    bei ausgeblendeten Controls (.Visibel = False) unterbrochen wird :?:
    Passiert bei DataBinding und PropertyBinding (zumindest bei der .Text-Eigenschaft)

    Diesen Umstand muss man auch einmal wissen ...

    VB1963
    ah - solche Probleme kenn ich von TabControl. Die zunächst nicht sichtbaren TabPages. Und ich fürchte, das betrifft jedes Binding - nicht nur das an Application-Settings.
    Aber das trat auch nicht immer auf.

    Den Grund vermute ich im Lazy Handle-Creating der Control-Klasse. Also wenn das Control-Handle erst nach dem Setzen des Bindings erstellt wird ist böse. Und es gab einen recht absurden, aber auch einfachen Workaround dafür - jdfs, wenn das bei TabControl auftrat.
    Aber ich muß mal ein Testprojekt dazu machen

    VB.NET-Quellcode

    1. Imports System.Runtime.CompilerServices
    2. Namespace System.Windows.Forms
    3. Public Module TabControlX
    4. ''' <summary>
    5. ''' Dieser Schwachsinn im Form_Load ausgeführt behebt einen Bug beim DataBinding auf beim Start nicht sichtbaren Tabpages.
    6. ''' </summary>
    7. <Extension()> _
    8. Public Sub InitBindability(ByVal tc As TabControl)
    9. Dim parent = tc.FindForm
    10. parent.SuspendLayout()
    11. For Each tp As TabPage In tc.TabPages
    12. tp.SuspendLayout()
    13. For Each ctl In tp.Controls.Cast(Of Control).ToArray
    14. parent.Controls.Add(ctl)
    15. tp.Controls.Add(ctl)
    16. Next
    17. tp.ResumeLayout()
    18. Next
    19. parent.ResumeLayout()
    20. End Sub
    21. End Module
    22. End Namespace
    Also alle Controls einmal woanners hin verschieben und wieder zurück.
    Dabe nicht rekursiv in die Baumstruktur gehen, sondern es langt, den obersten Container so zu behandeln (ich hab zB meist ein SplitContainer auf einer Tabpage).
    So, ich habe ein kleines Test-Projekt angehängt.
    Textbox1.Visible ist im Designer auf False vorbelegt.
    Bindung der Textbox.Text-Eigenschaft mit My.Settings.TestInteger codeseitig hergestellt...
    Label1 zeigt nur den Inhalt von der Textbox zur Veranschaulichung an...
    Theoretisch müsste in Form1.Shown das PropertyBinding aktiv sein, da die Label.Text-Eigenschaft erst nachher bedient wird...

    mit vorbelegter .Visibel=True im Designer funktioniert es wie gewohnt sofort...

    Der Button macht abwechselnd die Textbox sichtbar oder unsichtbar und zählt den Wert TestInteger immer um 1 hoch...
    Dateien
    ich kann keinerlei Fehlverhalten feststellen:


    Und hier noch mein Vorschlag, wie man das Databinding-mäßig angehen würde:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
    3. TextBox1.DataBindings.Add(New Binding("Text", My.MySettings.Default, "TestInteger", True, DataSourceUpdateMode.OnPropertyChanged))
    4. Label1.DataBindings.Add("Text", My.MySettings.Default, "TestInteger")
    5. End Sub
    6. Private Sub Button(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    7. My.MySettings.Default.TestInteger += 1
    8. With Me.TextBox1
    9. .Visible = Not .Visible
    10. End With
    11. End Sub
    12. End Class
    die Daten programmieren, und vermeiden versuchen, an den Controls rumzufummeln
    Vielen Dank @EDR:
    Ich meinte das String.Empty im 1.Bild, das dürfte eigentlich nicht sein - denke ich...

    Aber das Bessere (wieder was gelernt):
    Ich habe deine Codeverbesserungen gleich bei mir ausprobiert und es funzt auf einmal :) ohne ein String.Empty!
    ...lag dann an der 'Control's-Fummelei' :?:

    Ich muss mich hier noch mehr über die Datenbindung herantrauen und ihrer mehr vertrauen...
    die Controls in Ruhe lassen ...
    meinen Programmierstiel umgewöhnen, auch wenn's im Kopfe weh tut ;)

    Danke wieder einmal für deine praktischen Hinweise!