nochmal von vorn (jetzt mal mit etwas Code)
Das (eigene) Steuerelement namens "TimeWindow" ist so aufgebaut, dass 4 Properties beliebig gesetzt werden können. Es müssen also nicht alle gesetzt, bzw. verändert werden. Meist sind es nur zwei. Mal die einen, mal die anderen zwei. Mit einer "Startfunktion" erfolgt dann die Weiterverarbeitung.
In meiner aktuellen Anwendung sind nun die 4 Properties an eine DataTable "dt" gebunden:
With TimeWindow
.DataBindings.Clear()
.DataBindings.Add("TimeStartMin", dt, "start")
.DataBindings.Add("TimeStart", dt, "start")
.DataBindings.Add("TimeStop", dt, "stop")
.DataBindings.Add("TimeStopMax", dt, "stop")
End With Gesteuert wird die DataTable durch eine ComboBox mit DataSource:
With cbo
.DataSource = dt
.DisplayMember = "Name"
.ValueMember = "ID"
End With Wird die ComboBox betätigt, werden die Properties auch aufgerufen. So weit, so gut.
Was fehlt, ist die Möglichkeit meinem Steuerelement einen "Startbefehl" zu geben, und zwar NACH dem aktualisieren der Properties.
Da alle ComboBox Events schon VOR dem Aktualisieren der BataBindings kommen, helfen sie mir nicht.
Als Workaround habe ich dann eine zusätzliche TextBox an die Datatable gebunden.
With BindingTextBox
.DataBindings.Clear()
.DataBindings.Add("Text", dt, "ID")
End With über den TextChanged-Event der BindingTextBox wird mein Steuerelement dann gestartet:
Private Sub BindingTextBox_TextChanged(ByVal sender As Object, ByVal e As _
System.EventArgs) Handles BindingTextBox.TextChanged
TimeWindow.Start()
End Sub Das Ganze funktioniert wohl, aber es gibt da einige Unsicherheiten, z.B. ist mir nicht bekannt, in welcher Reihenfolge die Bindungen akzualisiert werden. Zuerst die BindingTextBox oder zuerst das TimeWindow?
Bei mir kommt zuerst das TimeWindow und dann die BindingTextBox.
Heute Vormittag habe ich mich dann - dem Tip entsprechend - mit einer zusätzliche BindingSource und dem "BindingComplete"-Event herumgeschlagen, aber leider hat mich das auch nicht weitergeracht.
Private BS As New BindingSource()
...
Private WithEvents id As Binding
...
With BindingTextBox
.DataBindings.Clear()
id = .DataBindings.Add("Text", BS, "ID")
End With
...
With cbo
.DataSource = BS
.DisplayMember = "Name"
.ValueMember = "ID"
End With
...
Private Sub id_BindingComplete(ByVal sender As Object, ByVal e As _
System.Windows.Forms.BindingCompleteEventArgs) Handles id.BindingComplete
Debug.Print("BindingComplete")
End Sub
Private Sub id_Format(ByVal sender As Object, ByVal e As _
System.Windows.Forms.ConvertEventArgs) Handles id.Format
Debug.Print("Format")
End Sub
... Meine Experimente habe ich mit der BindingTextBox durchgeführt. Leider bekomme ich es nicht hin, dass das "BindingComplete" gefeuert wird, wohl aber "Format" !?! Der "BindingComplete" kommt auch nicht, wenn ich etwas in die TextBox eingebe.
Ich weiss leider aber auch nicht, wie mir diese Events bei meinem Problem helfen könnten.
So komme ich da irgendwie nicht weiter.
Ich habe da noch einen anderen Ansatz, aber auch noch zwei unbeantwortete Fragen dazu.
Das Betätigen der ComboBox verändert doch sozusagen die aktuelle DataRow der DataTable.
1) Gibt es ein Event der mitteilt, das sich die aktuelle Row geändert hat?
und
2) Wie komme ich denn eigentlich an die Daten der nichtgebundenen Columns der aktuellen DataRow heran?
etwa nur so:
ActDataRow = dt.Select("ID=" & BindingTextBox.Text)(0)) oder auch noch anders?
Vielleicht hat ja jemand auch noch eine ganz andere Idee.
Erstmal vielen Dank
Gruß
Helmut
Beitrag wurde zuletzt am 24.11.11 um 14:22:38 editiert. |