Imports System.ComponentModel Imports DevExpress.XtraEditors Imports DevExpress.XtraLayout Imports DevExpress.XtraTab Imports DigitalData.Modules.Language.Utils Public Class ClassDetailPages Public Items As New Dictionary(Of String, DetailPage) Public CurrentPage As DetailPage Public Event AnyControl_Focus As EventHandler(Of DetailPageEventArgs) Public Event AnyControl_Changed As EventHandler(Of DetailPageEventArgs) Public Class DetailPageEventArgs Public Property Page As DetailPage End Class Public Class DetailPage Public IsPrimary As Boolean = False Public TabPage As XtraTabPage Public Name As String Public BindingSource As BindingSource Public DataTable As DataTable Public AddedWhoEdit As TextEdit Public ChangedWhoEdit As TextEdit End Class Public Sub New(LayoutControls As List(Of LayoutControl)) For Each oLayoutControl In LayoutControls AddHandler oLayoutControl.Click, AddressOf Handle_Focus AddHandler oLayoutControl.GotFocus, AddressOf Handle_Focus For Each oContainer As LayoutControlItem In oLayoutControl.Root.Items Dim oControl As BaseEdit = oContainer.Control AddHandler oControl.GotFocus, AddressOf Handle_Focus AddHandler oControl.EditValueChanged, AddressOf Handle_EditValueChanged AddHandler oControl.Validating, AddressOf Handle_Validating Next Next End Sub Public Sub Add(Page As DetailPage) Items.Add(Page.TabPage.Name, Page) End Sub Public Sub AddRange(ParamArray Pages As DetailPage()) For Each oPage In Pages Add(oPage) Next End Sub Private Sub Handle_Validating(sender As Object, e As CancelEventArgs) Dim oControl As BaseEdit = sender Dim oBinding As Binding = oControl.DataBindings.Item("EditValue") If TypeOf oBinding.DataSource Is BindingSource Then Dim oSource As BindingSource = oBinding.DataSource Dim oTableName As String = oSource.DataMember Dim oDataSet As DataSet = oSource.DataSource Dim oTable = oDataSet.Tables(oTableName) Dim oColumnName As String = oBinding.BindingMemberInfo.BindingField Dim oColumn As DataColumn = oTable.Columns.Item(oColumnName) Dim oNullable As Boolean = oColumn.AllowDBNull If oNullable = False And NotNull(oControl.EditValue.ToString, String.Empty) = String.Empty Then Throw New NoNullAllowedException() End If End If Console.WriteLine() End Sub Private Sub Handle_Focus(sender As Control, e As EventArgs) Dim oControl As Control = sender Dim oLayoutControl As LayoutControl = Nothing ' Get the Layout Control containing the Edit Contol If TypeOf oControl.Parent Is LayoutControl Then oLayoutControl = oControl.Parent ElseIf TypeOf oControl Is LayoutControl Then oLayoutControl = oControl End If If oLayoutControl Is Nothing Then Exit Sub End If ' Get the TabPage containing the Layout Control Do_Handle_Focus(oLayoutControl, oControl) End Sub Private Sub Do_Handle_Focus(LayoutControl As LayoutControl, Control As Control) If TypeOf LayoutControl.Parent Is XtraTabPage Then Dim oTabPage As XtraTabPage = LayoutControl.Parent If Items.ContainsKey(oTabPage.Name) Then CurrentPage = Items.Item(oTabPage.Name) Dim oData As New DetailPageEventArgs With {.Page = Items.Item(oTabPage.Name)} RaiseEvent AnyControl_Focus(Control, oData) Else CurrentPage = Nothing RaiseEvent AnyControl_Focus(Control, Nothing) End If End If End Sub Private Sub Handle_EditValueChanged(sender As BaseEdit, e As EventArgs) Dim oControl As BaseEdit = sender ' Get the Layout Control containing the Edit Contol If TypeOf oControl.Parent Is LayoutControl Then Dim oLayoutControl As LayoutControl = oControl.Parent ' Get the TabPage containing the Layout Control If TypeOf oLayoutControl.Parent Is XtraTabPage Then Dim oTabPage As XtraTabPage = oLayoutControl.Parent If Items.ContainsKey(oTabPage.Name) Then Dim oData As New DetailPageEventArgs With {.Page = Items.Item(oTabPage.Name)} RaiseEvent AnyControl_Changed(oControl, oData) Else RaiseEvent AnyControl_Changed(oControl, Nothing) End If End If End If End Sub End Class