Load Dynamic Form for frmEdit, Save Application Skin, add UIConfig

This commit is contained in:
Jonathan Jenne 2019-02-21 16:53:27 +01:00
parent 08e3ca9dd3
commit 72788c84bd
18 changed files with 366 additions and 94 deletions

View File

@ -51,17 +51,21 @@ Public Class ConfigManager(Of T)
_Serializer = New XmlSerializer(_Blueprint.GetType)
If Not Directory.Exists(UserConfigPath) Then
Throw New DirectoryNotFoundException($"Path {UserConfigPath} does not exist!")
End If
Directory.CreateDirectory(UserConfigPath)
If Not Directory.Exists(ComputerConfigPath) Then
Throw New DirectoryNotFoundException($"Path {ComputerConfigPath} does not exist!")
'Throw New DirectoryNotFoundException($"Path {UserConfigPath} does not exist!")
End If
If Not _File.TestPathIsDirectory(UserConfigPath) Then
Throw New ArgumentException($"Path {UserConfigPath} is not a directory!")
End If
If Not Directory.Exists(ComputerConfigPath) Then
Directory.CreateDirectory(ComputerConfigPath)
'Throw New DirectoryNotFoundException($"Path {ComputerConfigPath} does not exist!")
End If
If Not _File.TestPathIsDirectory(ComputerConfigPath) Then
Throw New ArgumentException($"Path {ComputerConfigPath} is not a directory!")
End If

View File

@ -14,10 +14,16 @@ Namespace My
Public Sub App_Startup() Handles Me.Startup
Dim oLogConfig As New LogConfig(PathType.AppData)
Dim oConfigManager As New ConfigManager(Of ClassConfig)(oLogConfig, Windows.Forms.Application.UserAppDataPath, Windows.Forms.Application.CommonAppDataPath)
' TODO: WHERE SHOULD CONFIG BE SAVED? LOCAL/ROAMING
Dim oUIConfigPAth = IO.Path.Combine(Windows.Forms.Application.UserAppDataPath, ClassConstants.FOLDER_NAME_LAYOUT)
Dim oSystemConfigManager As New ConfigManager(Of ClassConfig)(oLogConfig, Windows.Forms.Application.UserAppDataPath, Windows.Forms.Application.CommonAppDataPath)
Dim oUIConfigManager As New ConfigManager(Of ClassUIConfig)(oLogConfig, oUIConfigPAth, oUIConfigPAth)
LogConfig = oLogConfig
ConfigManager = oConfigManager
SystemConfigManager = oSystemConfigManager
UIConfigManager = oUIConfigManager
_Logger = LogConfig.GetLogger()
_Logger.Debug("Starting Client Suite..")

View File

@ -9,4 +9,12 @@
Public Const FOLDER_NAME_LAYOUT = "Layout"
Public Const ATTRIBUTE_ID_COLUMN = "RECORD_ID"
Public Const DB_USER_ATTRIBUTE_ID = 1
Public Const DB_USER_ATTRIBUTE_SYSKEY = "001"
Public Const DB_GROUP_ATTRIBUTE_ID = 2
Public Const DB_GROUP_ATTRIBUTE_SYSKEY = "002"
End Class

View File

@ -1,4 +1,5 @@
Imports System.IO
Imports DevExpress.XtraGrid.Views.Base
''' <summary>
''' Helper Class to save DevExpress layouts
@ -17,6 +18,7 @@
Public Class ClassLayout
Public Enum GroupName
LayoutMain
LayoutUserManager
End Enum
Public Enum LayoutComponent
@ -35,6 +37,29 @@ Public Class ClassLayout
Return Path.Combine(GetLayoutDirectory(), oFileName)
End Function
''' <summary>
''' Returns a path for the chosen Devexpress layout file
''' </summary>
''' <param name="Group">The Group to which the the component belongs to. For example, a form could be a Layout</param>
''' <param name="Component">The component to which the layout belongs to</param>
''' <returns></returns>
Public Shared Function GetLayoutPath(Group As GroupName, Component As String) As String
Dim oFileName As String = $"{Group.ToString}-{Component}.xml"
Return Path.Combine(GetLayoutDirectory(), oFileName)
End Function
''' <summary>
''' Returns a path for the chosen Devexpress layout file
''' </summary>
''' <param name="Group">The Group to which the the component belongs to. For example, a form could be a Layout</param>
''' <param name="Component">The component to which the layout belongs to</param>
''' <param name="SubComponent">The sub component under the component</param>
''' <returns></returns>
Public Shared Function GetLayoutPath(Group As GroupName, Component As String, SubComponent As String) As String
Dim oFileName As String = $"{Group.ToString}-{Component}-{SubComponent}.xml"
Return Path.Combine(GetLayoutDirectory(), oFileName)
End Function
Public Shared Function GetLayoutDirectory() As String
Return Path.Combine(GetAppDataFolder(), ClassConstants.FOLDER_NAME_LAYOUT)
End Function

View File

@ -19,7 +19,7 @@ Public Class ClassService
End Sub
Public Function TestConnection() As ConnectionTestResult
Return TestConnection(My.Config.ServiceConnection)
Return TestConnection(My.SysConfig.ServiceConnection)
End Function
Public Function TestConnection(EndpointURL As String) As ConnectionTestResult
@ -41,7 +41,7 @@ Public Class ClassService
End Function
Public Async Function TestConnectionAsync() As Task(Of ConnectionTestResult)
Return Await TestConnectionAsync(My.Config.ServiceConnection)
Return Await TestConnectionAsync(My.SysConfig.ServiceConnection)
End Function
Public Async Function TestConnectionAsync(EndpointURL As String) As Task(Of ConnectionTestResult)
@ -65,7 +65,7 @@ Public Class ClassService
End Function
Public Function GetChannelFactory() As IChannelFactory(Of IEDMServiceChannel)
Return GetChannelFactory(My.Config.ServiceConnection)
Return GetChannelFactory(My.SysConfig.ServiceConnection)
End Function
Public Function GetChannelFactory(EndpointURL As String) As ChannelFactory(Of IEDMServiceChannel)

View File

@ -0,0 +1,3 @@
Public Class ClassUIConfig
Public Property SkinName As String = "Office 2016 Colorful"
End Class

View File

@ -123,6 +123,7 @@
<Compile Include="ClassLayout.vb" />
<Compile Include="ClassService.vb" />
<Compile Include="ClassTimer.vb" />
<Compile Include="ClassUIConfig.vb" />
<Compile Include="ClassUIUtils.vb" />
<Compile Include="ClassUtils.vb" />
<Compile Include="DockManagerTest.Designer.vb">

View File

@ -1,9 +1,10 @@
DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.Docking2010.DocumentManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraDataLayout.DataLayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraVerticalGrid.PropertyGridControl, DevExpress.XtraVerticalGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.Docking.DockManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.ButtonEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.Docking2010.DocumentManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraTabbedMdi.XtraTabbedMdiManager, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraGrid.GridControl, DevExpress.XtraGrid.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraLayout.LayoutControl, DevExpress.XtraLayout.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a
DevExpress.XtraBars.Ribbon.RibbonControl, DevExpress.XtraBars.v18.1, Version=18.1.5.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a

View File

@ -11,12 +11,20 @@ Namespace My
''' </summary>
<HideModuleName()>
Module Extension
Property ConfigManager As ConfigManager(Of ClassConfig)
ReadOnly Property Config As ClassConfig
Property SystemConfigManager As ConfigManager(Of ClassConfig)
ReadOnly Property SysConfig As ClassConfig
Get
Return ConfigManager.Config
Return SystemConfigManager.Config
End Get
End Property
Property UIConfigManager As ConfigManager(Of ClassUIConfig)
ReadOnly Property UIConfig As ClassUIConfig
Get
Return UIConfigManager.Config
End Get
End Property
Property LogConfig As LogConfig
Property ChannelFactory As ChannelFactory(Of IEDMServiceChannel)
Property Channel As IEDMServiceChannel

View File

@ -1,6 +1,7 @@
Imports DevExpress.XtraGrid
Imports DevExpress.XtraGrid.Views.Base
Imports DevExpress.XtraGrid.Views.Grid
Imports DigitalData.GUIs.ClientSuite.ClassLayout
Public Class UserControlAssignment
Private _DragDropManager As ClassDragDrop
@ -41,6 +42,22 @@ Public Class UserControlAssignment
GridAssignedToParent = ClassUIUtils.ConfigureGridControlDefaults(GridAssignedToParent, [ReadOnly]:=True)
ViewAssignedToParent.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect
ViewAssignedToParent.OptionsSelection.MultiSelect = True
' Load view layouts
Dim ViewParentListPath = GetLayoutPath(GroupName.LayoutUserManager, Name, ViewParentList.Name)
Dim ViewAssignedPath = GetLayoutPath(GroupName.LayoutUserManager, Name, ViewAssignedToParent.Name)
Dim ViewNotAssignedPath = GetLayoutPath(GroupName.LayoutUserManager, Name, ViewNotAssignedToParent.Name)
If IO.File.Exists(ViewParentListPath) Then
ViewParentList.RestoreLayoutFromXml(ViewParentListPath)
End If
If IO.File.Exists(ViewAssignedPath) Then
ViewAssignedToParent.RestoreLayoutFromXml(ViewAssignedPath)
End If
If IO.File.Exists(ViewNotAssignedPath) Then
ViewNotAssignedToParent.RestoreLayoutFromXml(ViewNotAssignedPath)
End If
End Sub
Private Function MaybeCopyToDataTable(RowCollection As EnumerableRowCollection(Of DataRow)) As DataTable
@ -174,4 +191,10 @@ Public Class UserControlAssignment
GridAssignedToParent.DataSource = MaybeCopyToDataTable(oAssignedChildren)
GridNotAssignedToParent.DataSource = MaybeCopyToDataTable(oNotAssignedChildren)
End Sub
Private Sub View_LayoutChanged(sender As Object, e As EventArgs) Handles ViewNotAssignedToParent.Layout, ViewAssignedToParent.Layout, ViewParentList.Layout
Dim oView As BaseView = sender
Dim oLayoutPath = GetLayoutPath(GroupName.LayoutUserManager, Name, oView.Name)
oView.SaveLayoutToXml(oLayoutPath)
End Sub
End Class

View File

@ -1,6 +1,6 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()>
Partial Class frmEdit
Inherits System.Windows.Forms.Form
Inherits DevExpress.XtraBars.Ribbon.RibbonForm
'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen.
<System.Diagnostics.DebuggerNonUserCode()>
@ -22,27 +22,38 @@ Partial Class frmEdit
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Me.SplitContainerControl1 = New DevExpress.XtraEditors.SplitContainerControl()
Me.GridList = New DevExpress.XtraGrid.GridControl()
Me.ViewList = New DevExpress.XtraGrid.Views.Grid.GridView()
Me.PanelEditControls = New DevExpress.XtraEditors.PanelControl()
Me.LayoutControl1 = New DevExpress.XtraLayout.LayoutControl()
Me.LayoutControlGroup1 = New DevExpress.XtraLayout.LayoutControlGroup()
Me.RibbonControl1 = New DevExpress.XtraBars.Ribbon.RibbonControl()
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonPageGroup2 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonStatusBar1 = New DevExpress.XtraBars.Ribbon.RibbonStatusBar()
Me.RibbonPage2 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.BarButtonItem1 = New DevExpress.XtraBars.BarButtonItem()
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainerControl1.SuspendLayout()
CType(Me.GridList, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.ViewList, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.PanelEditControls, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.LayoutControlGroup1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'SplitContainerControl1
'
Me.SplitContainerControl1.Dock = System.Windows.Forms.DockStyle.Fill
Me.SplitContainerControl1.Location = New System.Drawing.Point(0, 0)
Me.SplitContainerControl1.Location = New System.Drawing.Point(0, 146)
Me.SplitContainerControl1.Name = "SplitContainerControl1"
Me.SplitContainerControl1.Panel1.Controls.Add(Me.GridList)
Me.SplitContainerControl1.Panel1.Text = "Panel1"
Me.SplitContainerControl1.Panel2.Controls.Add(Me.PanelEditControls)
Me.SplitContainerControl1.Panel2.Controls.Add(Me.LayoutControl1)
Me.SplitContainerControl1.Panel2.Text = "Panel2"
Me.SplitContainerControl1.Size = New System.Drawing.Size(1104, 505)
Me.SplitContainerControl1.Size = New System.Drawing.Size(1104, 338)
Me.SplitContainerControl1.SplitterPosition = 332
Me.SplitContainerControl1.TabIndex = 0
Me.SplitContainerControl1.Text = "SplitContainerControl1"
@ -53,7 +64,7 @@ Partial Class frmEdit
Me.GridList.Location = New System.Drawing.Point(0, 0)
Me.GridList.MainView = Me.ViewList
Me.GridList.Name = "GridList"
Me.GridList.Size = New System.Drawing.Size(332, 505)
Me.GridList.Size = New System.Drawing.Size(332, 338)
Me.GridList.TabIndex = 0
Me.GridList.ViewCollection.AddRange(New DevExpress.XtraGrid.Views.Base.BaseView() {Me.ViewList})
'
@ -62,13 +73,70 @@ Partial Class frmEdit
Me.ViewList.GridControl = Me.GridList
Me.ViewList.Name = "ViewList"
'
'PanelEditControls
'LayoutControl1
'
Me.PanelEditControls.Dock = System.Windows.Forms.DockStyle.Fill
Me.PanelEditControls.Location = New System.Drawing.Point(0, 0)
Me.PanelEditControls.Name = "PanelEditControls"
Me.PanelEditControls.Size = New System.Drawing.Size(760, 505)
Me.PanelEditControls.TabIndex = 0
Me.LayoutControl1.Dock = System.Windows.Forms.DockStyle.Fill
Me.LayoutControl1.Location = New System.Drawing.Point(0, 0)
Me.LayoutControl1.Name = "LayoutControl1"
Me.LayoutControl1.OptionsCustomizationForm.DesignTimeCustomizationFormPositionAndSize = New System.Drawing.Rectangle(-870, 211, 650, 400)
Me.LayoutControl1.Root = Me.LayoutControlGroup1
Me.LayoutControl1.Size = New System.Drawing.Size(760, 338)
Me.LayoutControl1.TabIndex = 0
Me.LayoutControl1.Text = "LayoutControl1"
'
'LayoutControlGroup1
'
Me.LayoutControlGroup1.EnableIndentsWithoutBorders = DevExpress.Utils.DefaultBoolean.[True]
Me.LayoutControlGroup1.GroupBordersVisible = False
Me.LayoutControlGroup1.Name = "Root"
Me.LayoutControlGroup1.Size = New System.Drawing.Size(760, 338)
Me.LayoutControlGroup1.TextVisible = False
'
'RibbonControl1
'
Me.RibbonControl1.ExpandCollapseItem.Id = 0
Me.RibbonControl1.Items.AddRange(New DevExpress.XtraBars.BarItem() {Me.RibbonControl1.ExpandCollapseItem, Me.BarButtonItem1})
Me.RibbonControl1.Location = New System.Drawing.Point(0, 0)
Me.RibbonControl1.MaxItemId = 2
Me.RibbonControl1.Name = "RibbonControl1"
Me.RibbonControl1.Pages.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPage() {Me.RibbonPage1})
Me.RibbonControl1.Size = New System.Drawing.Size(1104, 146)
Me.RibbonControl1.StatusBar = Me.RibbonStatusBar1
'
'RibbonPage1
'
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageGroup1, Me.RibbonPageGroup2})
Me.RibbonPage1.Name = "RibbonPage1"
Me.RibbonPage1.Text = "RibbonPage1"
'
'RibbonPageGroup1
'
Me.RibbonPageGroup1.ItemLinks.Add(Me.BarButtonItem1)
Me.RibbonPageGroup1.Name = "RibbonPageGroup1"
Me.RibbonPageGroup1.Text = "RibbonPageGroup1"
'
'RibbonPageGroup2
'
Me.RibbonPageGroup2.Name = "RibbonPageGroup2"
Me.RibbonPageGroup2.Text = "RibbonPageGroup2"
'
'RibbonStatusBar1
'
Me.RibbonStatusBar1.Location = New System.Drawing.Point(0, 484)
Me.RibbonStatusBar1.Name = "RibbonStatusBar1"
Me.RibbonStatusBar1.Ribbon = Me.RibbonControl1
Me.RibbonStatusBar1.Size = New System.Drawing.Size(1104, 21)
'
'RibbonPage2
'
Me.RibbonPage2.Name = "RibbonPage2"
Me.RibbonPage2.Text = "RibbonPage2"
'
'BarButtonItem1
'
Me.BarButtonItem1.Caption = "BarButtonItem1"
Me.BarButtonItem1.Id = 1
Me.BarButtonItem1.Name = "BarButtonItem1"
'
'frmEdit
'
@ -76,19 +144,34 @@ Partial Class frmEdit
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(1104, 505)
Me.Controls.Add(Me.SplitContainerControl1)
Me.Controls.Add(Me.RibbonStatusBar1)
Me.Controls.Add(Me.RibbonControl1)
Me.Name = "frmEdit"
Me.Ribbon = Me.RibbonControl1
Me.StatusBar = Me.RibbonStatusBar1
Me.Text = "frmEdit"
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.SplitContainerControl1.ResumeLayout(False)
CType(Me.GridList, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.ViewList, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.PanelEditControls, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.LayoutControl1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.LayoutControlGroup1, System.ComponentModel.ISupportInitialize).EndInit()
CType(Me.RibbonControl1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents SplitContainerControl1 As DevExpress.XtraEditors.SplitContainerControl
Friend WithEvents GridList As DevExpress.XtraGrid.GridControl
Friend WithEvents ViewList As DevExpress.XtraGrid.Views.Grid.GridView
Friend WithEvents PanelEditControls As DevExpress.XtraEditors.PanelControl
Friend WithEvents LayoutControl1 As DevExpress.XtraLayout.LayoutControl
Friend WithEvents LayoutControlGroup1 As DevExpress.XtraLayout.LayoutControlGroup
Friend WithEvents RibbonControl1 As DevExpress.XtraBars.Ribbon.RibbonControl
Friend WithEvents RibbonPage1 As DevExpress.XtraBars.Ribbon.RibbonPage
Friend WithEvents RibbonPageGroup1 As DevExpress.XtraBars.Ribbon.RibbonPageGroup
Friend WithEvents RibbonPageGroup2 As DevExpress.XtraBars.Ribbon.RibbonPageGroup
Friend WithEvents RibbonStatusBar1 As DevExpress.XtraBars.Ribbon.RibbonStatusBar
Friend WithEvents RibbonPage2 As DevExpress.XtraBars.Ribbon.RibbonPage
Friend WithEvents BarButtonItem1 As DevExpress.XtraBars.BarButtonItem
End Class

View File

@ -1,11 +1,104 @@
Public Class frmEdit
Public Property Datatable As DataTable
Imports DevExpress.XtraEditors
Imports DevExpress.XtraLayout
Private Sub frmEdit_Load(sender As Object, e As EventArgs) Handles MyBase.Load
GridList = ClassUIUtils.ConfigureGridControlDefaults(GridList)
Public Class frmEdit
Private ReadOnly _Datatable As DataTable
Private _LanguageDatatable As DataTable
Private _AttributeId As Integer
Public Sub New(AttributeId As Integer, Datatable As DataTable)
' Dieser Aufruf ist für den Designer erforderlich.
InitializeComponent()
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
_Datatable = DataTable
GridList.DataSource = DataTable
_Datatable = Datatable
_AttributeId = AttributeId
End Sub
Private Async Sub frmEdit_Load(sender As Object, e As EventArgs) Handles MyBase.Load
GridList = ClassUIUtils.ConfigureGridControlDefaults(GridList, [ReadOnly]:=True)
' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu.
GridList.DataSource = _Datatable
Dim oUserLanguage = My.Application.User.Language
Await LoadLanguageTableAsync(oUserLanguage)
LoadFormLayout()
End Sub
Private Async Function LoadLanguageTableAsync(UserLanguage As String) As Task
Dim oSQL = $"SELECT * FROM VWICM_ATTRIBUTE_LANGUAGE WHERE LANGUAGE_CODE = '{UserLanguage}' AND PARENT_ATTRIBUTE_ID = '{_AttributeId}' ORDER BY ""SEQUENCE"";"
Await My.Channel.CreateDatabaseRequestAsync("Language Syskey", False)
Dim oResult = Await My.Channel.ReturnDatatableAsync(oSQL)
_LanguageDatatable = oResult.Table
Await My.Channel.CloseDatabaseRequestAsync()
End Function
Private Function GetColumnEditor(Column As DataColumn, AttributeId As Integer)
Dim oEditor As BaseEdit
Select Case Column.DataType
Case GetType(Int64)
Dim oTextEdit = New TextEdit()
oTextEdit.Name = Column.ColumnName
oTextEdit.Properties.Mask.MaskType = Mask.MaskType.Numeric
oTextEdit.Properties.Mask.EditMask = "n"
oEditor = oTextEdit
Case Else
oEditor = New TextEdit() With {.Name = Column.ColumnName}
End Select
If AttributeId > 0 Then
oEditor.Tag = AttributeId
End If
Return oEditor
End Function
Private Function GetColumnCaption(Column As DataColumn, SequenceId As Integer)
Dim oRow = GetRowBySequence(SequenceId)
Dim oCaption = Column.ColumnName
If oRow IsNot Nothing Then
oCaption = oRow.Item("LANGUAGE_TERM")
ElseIf oCaption = ClassConstants.ATTRIBUTE_ID_COLUMN Then
oCaption = "ID"
End If
Return oCaption
End Function
Private Function GetRowBySequence(SequenceId As Integer)
Return _LanguageDatatable.Select($"SEQUENCE = {SequenceId}").FirstOrDefault()
End Function
Private Function GetRowItemBySequence(SequenceId As Integer, ColumnName As String)
Dim oRow = _LanguageDatatable.Select($"SEQUENCE = {SequenceId}").FirstOrDefault()
Return oRow?.Item(ColumnName)
End Function
Private Sub LoadFormLayout()
' Counter is used to match SEQUENCE in Attributes
' to column order in the used View (eg. VWICM_USER)
Dim oCounter = 0
For Each oColumn As DataColumn In _Datatable.Columns
Dim oAttributeId As Integer = GetRowItemBySequence(oCounter, "ATTRIBUTE_ID")
Dim oCaption = GetColumnCaption(oColumn, oCounter)
Dim oEditor = GetColumnEditor(oColumn, oAttributeId)
oEditor.DataBindings.Add(New Binding("Text", _Datatable, oColumn.ColumnName))
' Add Control to Layout
LayoutControlGroup1.AddItem(oCaption, oEditor)
ViewList.Columns.Item(oColumn.ColumnName).Caption = oCaption
oCounter = oCounter + 1
Next
' General Layout Tweaks
LayoutControlGroup1.AddItem(New EmptySpaceItem())
LayoutControlGroup1.LayoutMode = Utils.LayoutMode.Flow
End Sub
End Class

View File

@ -18,6 +18,8 @@ Public Class frmUserManager
AddHandler UCUserToGroup.ChildRemoved, AddressOf HandleUserAssignedToGroup
AddHandler UCUserToGroup.ChildAdded, AddressOf HandleUserDismissedFromGroup
RibbonControl.SelectPage(RibbonPageUserManager)
End Sub
Private Async Function InitUserToGroupData() As Task
@ -65,19 +67,20 @@ Public Class frmUserManager
Private Async Sub BarButtonUserEdit_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonUserEdit.ItemClick
Dim oDatatable = Await GetAttributeListAsync("User")
Dim oForm As New frmEdit()
oForm.Datatable = oDatatable
Dim oForm As New frmEdit(ClassConstants.DB_USER_ATTRIBUTE_ID, oDatatable)
'oForm.MdiParent = o
oForm.Show()
End Sub
Private Async Sub BarButtonGroupEdit_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonGroupEdit.ItemClick
Dim oDatatable = Await GetAttributeListAsync("Group")
Dim oForm As New frmEdit()
oForm.Datatable = oDatatable
Dim oForm As New frmEdit(ClassConstants.DB_GROUP_ATTRIBUTE_ID, oDatatable)
oForm.Show()
End Sub
Private Async Sub BarButtonRefresh_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonRefresh.ItemClick
Await UpdateUserToGroupData()
End Sub
End Class

View File

@ -4,9 +4,9 @@
Private Sub frmServiceConfig_Load(sender As Object, e As EventArgs) Handles Me.Load
_Service = New ClassService(My.LogConfig)
If My.ConfigManager.Config.ServiceConnection <> String.Empty Then
txtIPAddress.Text = My.ConfigManager.Config.ServiceIP
txtPort.Text = My.ConfigManager.Config.ServicePort
If My.SystemConfigManager.Config.ServiceConnection <> String.Empty Then
txtIPAddress.Text = My.SystemConfigManager.Config.ServiceIP
txtPort.Text = My.SystemConfigManager.Config.ServicePort
End If
txtIPAddress.Focus()
@ -18,14 +18,14 @@
Dim oEndpointURL = $"net.tcp://{oIPAddress}:{oPort}/DigitalData/Services/Main"
Dim oResult As ClassService.ConnectionTestResult
My.Config.ServiceIP = oIPAddress
My.Config.ServicePort = Integer.Parse(oPort)
My.SysConfig.ServiceIP = oIPAddress
My.SysConfig.ServicePort = Integer.Parse(oPort)
lblStatus.Text = "Verbindung wird hergestellt..."
oResult = Await _Service.TestConnectionAsync()
If oResult = ClassService.ConnectionTestResult.Successful Then
My.ConfigManager.Save()
My.SystemConfigManager.Save()
lblStatus.Text = "Verbindung hergestellt."
Else
Select Case oResult

View File

@ -14,7 +14,7 @@ Public Class frmConfigUser
Private Sub frmUserBasics_Load(sender As Object, e As EventArgs) Handles Me.Load
_Logger = My.LogConfig.GetLogger()
chkLogErrorsOnly.Checked = Not My.Config.LogDebug
chkLogErrorsOnly.Checked = Not My.SysConfig.LogDebug
End Sub
Private Sub btnLogFolder_Click(sender As Object, e As EventArgs) Handles btnLogFolder.Click
@ -28,7 +28,7 @@ Public Class frmConfigUser
Private Sub chkLogErrorsOnly_CheckedChanged(sender As Object, e As EventArgs) Handles chkLogErrorsOnly.CheckedChanged
Dim oLogDebug = Not chkLogErrorsOnly.Checked
My.LogConfig.Debug = oLogDebug
My.Config.LogDebug = oLogDebug
My.ConfigManager.Save()
My.SysConfig.LogDebug = oLogDebug
My.SystemConfigManager.Save()
End Sub
End Class

View File

@ -123,57 +123,56 @@
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="BarButtonExit.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAHXRFWHRUaXRsZQBDbG9zZTtF
eGl0O0JhcnM7UmliYm9uO0YDuegAAAC0SURBVDhPrZJBCsJAEAQ9Bf1XfuJHVCJINPgWPfkUf7N2LztL
7+x4kHgoxO7pIgY37/2Y1vB3wROcXaZMgDc1UwGLIaWcnSQ3DqUbwMNyFcw8MPBdJXks3WKdCsjFHR6B
H1/LbSggjURB14xJJCCdBFk3Jt8EzWMXAX9OdxsJurGBrpN4gX9hNxC92FAwuUOOrfOS+mdTwQvsgrGR
JfjcAt7mXAWExd1lygzqmHjBz6wUjOkDS6KAnnKqaOAAAAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAddEVYdFRpdGxlAENsb3NlO0V4aXQ7QmFycztSaWJi
b247RgO56AAAALRJREFUOE+tkkEKwkAQBD0F/Vd+4kdUIkg0+BY9+RR/s3YvO0vv7HiQeCjE7ukiBjfv
/ZjW8HfBE5xdpkyANzVTAYshpZydJDcOpRvAw3IVzDww8F0leSzdYp0KyMUdHoEfX8ttKCCNREHXjEkk
IJ0EWTcm3wTNYxcBf053Gwm6sYGuk3iBf2E3EL3YUDC5Q46t85L6Z1PBC+yCsZEl+NwC3uZcBYTF3WXK
DOqYeMHPrBSM6QNLooCecqpo4AAAAABJRU5ErkJggg==
</value>
</data>
<data name="BarButtonExit.ImageOptions.LargeImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAHXRFWHRUaXRsZQBDbG9zZTtF
eGl0O0JhcnM7UmliYm9uO0YDuegAAAF2SURBVFhH7ZZBTsMwEEW76n1AIFDFkptwPSrRLjgLhwDBBcDM
R/Mj2/l2xiAUJLp4rer543lJk7SblNKqfL083d2mNTgJ/AuBd7E2ERF4M26Mx2wtytHYGa/ZWsGSAIZf
en1rjEhg+NZ7Lwwp0RPAqduhRuxzVGIanvXiTHx4fQK1lgC4N4qNPNuTUMMh/uD1AtQZmhWdvaE2VBLH
PJdl5XCADIMy4Oy5IbG1WmLoyAlyDMtARu9MzIZ7vTscIMewDFS0JIaPnCA/IgBmEjmoGaHhAD1slIEG
UgJrRng4QN93BFrfOa8J1SNB36iAHE5QM8IS6GGjDFS0bjW1FpJAPirQu89b18SiBHIMy4ATecL1nhP5
XgXIMSwDRu/I62zkiVmADIMq0LraD1mmZuhMoM5QXcRP5zU38Qw26g0nSuLKGP45fjHOvR4dTiYJez8z
nn29YEkAQAL2I8MJJNArh4OIAOj+sVzgx39Kf5WTwN8RWI+0+QTdeyAQju/HFwAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAddEVYdFRpdGxlAENsb3NlO0V4aXQ7QmFycztSaWJi
b247RgO56AAAAXZJREFUWEftlkFOwzAQRbvqfUAgUMWSm3A9KtEuOAuHAMEFwMxH8yPb+XbGIBQkunit
6vnjeUmTtJuU0qp8vTzd3aY1OAn8C4F3sTYREXgzbozHbC3K0dgZr9lawZIAhl96fWuMSGD41nsvDCnR
E8Cp26FG7HNUYhqe9eJMfHh9ArWWALg3io0825NQwyH+4PUC1BmaFZ29oTZUEsc8l2XlcIAMgzLg7Lkh
sbVaYujICXIMy0BG70zMhnu9Oxwgx7AMVLQkho+cID8iAGYSOagZoeEAPWyUgQZSAmtGeDhA33cEWt85
rwnVI0HfqIAcTlAzwhLoYaMMVLRuNbUWkkA+KtC7z1vXxKIEcgzLgBN5wvWeE/leBcgxLANG78jrbOSJ
WYAMgyrQutoPWaZm6EygzlBdxE/nNTfxDDbqDSdK4soY/jl+Mc69Hh1OJgl7PzOefb1gSQBAAvYjwwkk
0CuHg4gA6P6xXODHf0p/lZPA3xFYj7T5BN17IBCO78cXAAAAAElFTkSuQmCC
</value>
</data>
<data name="BarButtonUserSettings.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAR3RFWHRUaXRsZQBDdXN0b21l
cjtFbXBsb3llZTtGaXg7UHVibGljO1NldHRpbmdzO09wdGlvbnM7Q3VzdG9taXo7R3JvdXA7VGVhbWkL
E4gAAAEQSURBVDhPpdM/agJREMfxNQYtbew9QQoF29xAU9p5AZsUEluR7T1AinSBnMC9ghZ7iOANBBUk
br6/ZR7Mk5UlpPjwmHH+vF01KYriXyqTf5GkaXpPA+84mA88IKqLghtdbFE4Q0R1Pri38QdhwAS+Jxqg
6X6bKLdz8QK+Jxqg6b5ZlPtEjjZ8fckHmh4NGK2yxDTRx9lOxeVnfkAHRzWagxVp0BtmuNqpuFzgB8gc
YcCUAm1S8cUaAsXKRwMe8YRn06BA19VGNa3Rs1Ox8n016uUs8Y09XkyLAj2zrq2GHrlXnRYrf9aAL4Rr
e+3xajOgqPYGp5vGIKeg7h00w/NXoqD+W6j6hwUqcPzvwHJZ8gvZcCD22oxTxwAAAABJRU5ErkJggg==
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABHdEVYdFRpdGxlAEN1c3RvbWVyO0VtcGxveWVlO0Zp
eDtQdWJsaWM7U2V0dGluZ3M7T3B0aW9ucztDdXN0b21pejtHcm91cDtUZWFtaQsTiAAAARBJREFUOE+l
0z9qAlEQx/E1Bi1t7D1BCgXb3EBT2nkBmxQSW5HtPUCKdIGcwL2CFnuI4A0EFSRuvr9lHsyTlSWk+PCY
cf68XTUpiuJfKpN/kaRpek8D7ziYDzwgqouCG11sUThDRHU+uLfxB2HABL4nGqDpfpsot3PxAr4nGqDp
vlmU+0SONnx9yQeaHg0YrbLENNHH2U7F5Wd+QAdHNZqDFWnQG2a42qm4XOAHyBxhwJQCbVLxxRoCxcpH
Ax7xhGfToEDX1UY1rdGzU7HyfTXq5SzxjT1eTIsCPbOurYYeuVedFit/1oAvhGt77fFqM6Co9ganm8Yg
p6DuHTTD81eioP5bqPqHBSpw/O/AclnyC9lwIPbajFPHAAAAAElFTkSuQmCC
</value>
</data>
<data name="BarButtonUserSettings.ImageOptions.LargeImage" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
YQUAAAAZdEVYdFNvZnR3YXJlAEFkb2JlIEltYWdlUmVhZHlxyWU8AAAAR3RFWHRUaXRsZQBDdXN0b21l
cjtFbXBsb3llZTtGaXg7UHVibGljO1NldHRpbmdzO09wdGlvbnM7Q3VzdG9taXo7R3JvdXA7VGVhbWkL
E4gAAALBSURBVFhHxdZPiE1hGMfxGf/CMLJUFjZScpXCTP4VO+lO3awQFlgodmIhm+lubG0lC0UkK39G
jT8ZhPyXaUZWSNhNIqK5vr+Z922enp5zHVehPjn3ed/397zn3HPOnbZGo/FfhcV/KSyWVa/X1+MyPuIH
PuEqNkTzI2GxDJp04ycaAdXXReu8sFgGDU6ZhpGz0TovLJZBgyeuofc0WueFxTJocBSjpqH3OlrnhcWM
kB0YgL3J7mIn2nEYUXPRfVCJcq2wKCw+YsIi+jcDI4jGpRplW2GRhTPx2QRFvqITt0zNeobpUb4VFlnY
ZYKaWYuLrpbtirK9sMjiTS6siOYdczX5gI4o2wuLLN5nwprZj+Wu9h0bo9xIWCTgngls5gF0vxzHfZzE
b+98KywS0o+ooddfsL6CKdGYFxZTQNF7PtP4Ukxza+dD74vH2KvPdtwLi8LCoscr0wtqMvTrtxsrsAfv
YOfpBXYCc6u9fW1e2FxYUEsBRTS+xtW8hcYCzCu9AWHBGUTBp9P4BVe/Y4ykJq8wnBt6YeOMkKk4gDdQ
g7c4BF36LamW6clp7+m9srrWe2kOx5XUpJHkpp1YlT+HjTMFmuPZ5nhS+n8zhjC2AZp3EzqK59iOG8gb
uJlqGtOcLsQbIGwRdPkPFozrV/C85inE0Nm9QG5aRHM0d2IDhM2CLu8g8mXVW63mmuvS20dU87WuQ4HY
itxIZ6qrIDrOdc2Z+ApYrLvZPz7WQ5zDI1Oz7JXQpc7Ne1JNdJw3oTnjG2DxMnwxYa3QBoZSeHYduXlm
7wkZ1gbKvnab0QZeuvDb8BtQzc4Z1Aa+ubBWLCYsN7FfQTXVRMfhV/DehbVKf5otIdTfhNcwkI5zfRvG
N2Dv8FbkoKT1x7BVCjFWQmf6dy+iP6EQR6/ZsbNL8gbyZ42VexWXkYOa0I+RBGN9bb8A1yMynixVuyMA
AAAASUVORK5CYII=
iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAABHdEVYdFRpdGxlAEN1c3RvbWVyO0VtcGxveWVlO0Zp
eDtQdWJsaWM7U2V0dGluZ3M7T3B0aW9ucztDdXN0b21pejtHcm91cDtUZWFtaQsTiAAAAsFJREFUWEfF
1k+ITWEYx/EZ/8IwslQWNlJylcJM/hU76U7drBAWWCh2YiGb6W5sbSULRSQrf0aNPxmE/JdpRlZI2E0i
orm+v5n3bZ6ennMdV6E+Ofd53/f3vOfcc86dtkaj8V+FxX8pLJZVr9fX4zI+4gc+4So2RPMjYbEMmnTj
JxoB1ddF67ywWAYNTpmGkbPROi8slkGDJ66h9zRa54XFMmhwFKOmofc6WueFxYyQHRiAvcnuYifacRhR
c9F9UIlyrbAoLD5iwiL6NwMjiMalGmVbYZGFM/HZBEW+ohO3TM16hulRvhUWWdhlgppZi4uulu2Ksr2w
yOJNLqyI5h1zNfmAjijbC4ss3mfCmtmP5a72HRuj3EhYJOCeCWzmAXS/HMd9nMRv73wrLBLSj6ih11+w
voIp0ZgXFlNA0Xs+0/hSTHNr50Pvi8fYq8923AuLwsKixyvTC2oy9Ou3GyuwB+9g5+kFdgJzq719bV7Y
XFhQSwFFNL7G1byFxgLMK70BYcEZRMGn0/gFV79jjKQmrzCcG3ph44yQqTiAN1CDtzgEXfotqZbpyWnv
6b2yutZ7aQ7HldSkkeSmnViVP4eNMwWa49nmeFL6fzOGMLYBmncTOorn2I4byBu4mWoa05wuxBsgbBF0
+Q8WjOtX8LzmKcTQ2b1AblpEczR3YgOEzYIu7yDyZdVbreaa69LbR1Tzta5DgdiK3EhnqqsgOs51zZn4
Clisu9k/PtZDnMMjU7PsldClzs17Uk10nDehOeMbYPEyfDFhrdAGhlJ4dh25eWbvCRnWBsq+dpvRBl66
8NvwG1DNzhnUBr65sFYsJiw3sV9BNdVEx+FX8N6FtUp/mi0h1N+E1zCQjnN9G8Y3YO/wVuSgpPXHsFUK
MVZCZ/p3L6I/oRBHr9mxs0vyBvJnjZV7FZeRg5rQj5EEY31tvwDXIzKeLFW7IwAAAABJRU5ErkJggg==
</value>
</data>
<data name="BarButtonConnectionSettings.ImageOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View File

@ -4,10 +4,12 @@ Imports DigitalData.GUIs.ClientSuite.ClassLayout
Imports System.IO
Imports DigitalData.Modules.Logging
Imports DigitalData.Modules.License
Imports DevExpress.LookAndFeel
Public Class frmMain
Private _Logger As Logger
Private _Timer As ClassTimer
Private _Loading As Boolean = True
Public Sub New()
' Dieser Aufruf ist für den Designer erforderlich.
@ -36,10 +38,12 @@ Public Class frmMain
Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles Me.Load
' Initialize Main Timer
_Timer = New ClassTimer(My.LogConfig, Me, My.Config.HeartbeatInterval)
_Timer = New ClassTimer(My.LogConfig, Me, My.SysConfig.HeartbeatInterval)
AddHandler _Timer.OnlineChanged, AddressOf HandleOnlineChanged
SetOnlineLabel()
UserLookAndFeel.Default.SetSkinStyle(My.UIConfig.SkinName)
LabelCurrentUser.Caption = My.Application.User.UserName
LabelCurrentMachine.Caption = My.Application.User.MachineName
LabelCurrentVersion.Caption = My.Application.Info.Version.ToString
@ -64,7 +68,11 @@ Public Class frmMain
MsgBox($"Clicked on Document {RowView.Row.Item("DocName")}")
End Sub
AddHandler UserLookAndFeel.Default.StyleChanged, AddressOf frmMain_StyleChanged
LoadLayout()
_Loading = False
End Sub
Private Sub FrmMain_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
@ -153,4 +161,11 @@ Public Class frmMain
oForm.MdiParent = DocumentManager.MdiParent
oForm.Show()
End Sub
Private Sub frmMain_StyleChanged(sender As Object, e As EventArgs) Handles Me.StyleChanged
If _Loading = False Then
My.UIConfig.SkinName = LookAndFeel.ActiveSkinName
My.UIConfigManager.Save()
End If
End Sub
End Class

View File

@ -25,7 +25,7 @@ Public NotInheritable Class frmSplash
BringToFront()
Dim oService As New ClassService(My.LogConfig)
Dim oConnectionURLExists As Boolean = My.Config.ServiceConnection <> String.Empty
Dim oConnectionURLExists As Boolean = My.SysConfig.ServiceConnection <> String.Empty
'Dim oInit As New ClassInit()
'Dim oConnectionURLExists = oInit.TestConnectionURLExists()