Hallo!
Ich nutze in meinen kleinen Programmen gerne eine eigene Serialisierbare Klasse für Einstellungen.
Diese Klasse lässt sich einfach als XML Speichern:
Imports System.IO
Imports System.Xml.Serialization
Imports System.Reflection
<Serializable()> _
Public Class clsEinstellungen
Implements ICloneable
Implements System.ComponentModel.INotifyPropertyChanged
Private _Test1 As String = "Demo1"
Property Test1 As String
Get
Return _Test1
End Get
Set(value As String)
_Test1 = value
NotifyPropertyChanged("Test1")
End Set
End Property
Private _Test2 As String = "Demo2"
Property Test2 As String
Get
Return _Test2
End Get
Set(value As String)
_Test2 = value
NotifyPropertyChanged("Test2")
End Set
End Property
Public Function Clone() As Object Implements System.ICloneable.Clone
Return MemberwiseClone()
End Function
' Creates a copy of an object
Public Shared Function GetCopy(Of SourceType As {Class, New})(ByVal Source _
As SourceType) As SourceType
Dim ReturnValue As New SourceType
Dim sourceProperties() As PropertyInfo = Source.GetType().GetProperties( _
)
For Each sourceProp As PropertyInfo In sourceProperties
sourceProp.SetValue(ReturnValue, sourceProp.GetValue(Source, _
Nothing), Nothing)
Next
Return ReturnValue
End Function
<NonSerialized()> _
Public Event PropertyChanged(ByVal sender As Object, _
ByVal e As System.ComponentModel.PropertyChangedEventArgs) _
Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged
Private Sub NotifyPropertyChanged(ByVal info As String)
RaiseEvent PropertyChanged(Me, _
New System.ComponentModel.PropertyChangedEventArgs(info))
End Sub
End Class Ich versuche mich jetzt gerade an DataBindings, damit nicht immer alles manuell programmiert werden muss. Daher habe ich im o.g. Code auch schon das Propertychanged Event mit drin.
Soweit funktioniert das gut. Habe ich eine Main-Form und setze ein Property in meiner Klasse neu (z.B. über einen Button), wird auch ein dazugehöriges Label aktualisiert.
Jetzt möchte ich jedoch einen Einstellungsdialog aufbauen, der aber nicht mit der Instanz der Klasse sondern mit einer Kopie arbeitet. So kann ich über einen Abbrechen-Button einfach alle Änderungen verwerfen. Dafür habe ich die "GetCopy()" bzw. die "Clone()" Prozedur gleich mit in die Klasse aufgenommen.
Public Class FrmEinstellungen
Private Einstellungen As clsEinstellungen
Private Sub FrmEinstellungen_Load(sender As System.Object, e As _
System.EventArgs) Handles MyBase.Load
Me.Einstellungen = clsEinstellungen.GetCopy(Form1.Einstellungen)
TextBox1.DataBindings.Add(New Binding("Text", Einstellungen, "Test1", _
True, DataSourceUpdateMode.OnPropertyChanged))
TextBox2.DataBindings.Add(New Binding("Text", Einstellungen, "Test2", _
True, DataSourceUpdateMode.OnPropertyChanged))
End Sub
Private Sub BtnAbbrechen_Click(sender As System.Object, e As _
System.EventArgs) Handles BtnAbbrechen.Click
Me.Close()
End Sub
Private Sub BtnSpeichern_Click(sender As System.Object, e As _
System.EventArgs) Handles BtnSpeichern.Click
Form1.Einstellungen = clsEinstellungen.GetCopy(Einstellungen)
Me.Close()
End Sub
End Class Das Problem an der Sache ist aber wie folgt:
Ich muss zum Speichern der Einstellungen die Kopie wieder zurückkopieren. Sobald ich das Object wieder zurückclone funktionieren die DataBindings in der MainForm nicht mehr. Diese müssten dann nochmal wieder neu gesetzt werden.
Irgendwie ist das schwierig zu erklären. Daher habe ich mal ein kleines Testprogramm gemacht:
http://drive.google.com/uc?export=download&id=0B--trzUVMN-zdGtPTlo4UURSVFU
Meine Fragen sind jetzt eigentlich:
Wie würdet ihr das machen? Jedes mal die DataBindings erneuern? (wäre ja auch kein großer Aufwand)
oder keine Möglichkeit des Abbrechens geben. Wurde etwas in den Einstellungen verändert wird es sofort übernommen (also gar nicht mit einer Objektkopie)
Oder sollte man so etwas lieber gar nicht mit DataBindings machen? So oft kommt es ja auch eigentlich nicht vor, das man Einstellungen nochmal als Label in der MainForm anzeigt...
Gruß
Bismosa |