Imports System.Windows.Forms Public Class BaseEditForm Inherits Windows.Forms.Form Enum EditingOrAdding Editing Adding Loading NoAction End Enum 'EditingOrAdding Private mvalEditingOrAdding As EditingOrAdding Private mintCurrentSortColumn As Integer Private mobjEditFormExistingItemColumnSortRules() As clsGridColumnSortRule #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub 'Required by the Windows Form Designer Private components As System.ComponentModel.IContainer 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Protected WithEvents fraAddEdit As Windows.Forms.GroupBox Private WithEvents btnEdit As Windows.Forms.Button Private WithEvents btnDelete As Windows.Forms.Button Private WithEvents btnSave As Windows.Forms.Button Private WithEvents btnCancel As Windows.Forms.Button Private WithEvents btnRevert As Windows.Forms.Button Private WithEvents btnExit As Windows.Forms.Button Private WithEvents lvwExistingItemsList As Windows.Forms.ListView Private Sub InitializeComponent() Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(BaseEditForm)) Me.btnEdit = New Windows.Forms.Button Me.btnDelete = New Windows.Forms.Button Me.btnExit = New Windows.Forms.Button Me.fraAddEdit = New Windows.Forms.GroupBox Me.btnRevert = New Windows.Forms.Button Me.btnCancel = New Windows.Forms.Button Me.btnSave = New Windows.Forms.Button Me.lvwExistingItemsList = New Windows.Forms.ListView Me.fraAddEdit.SuspendLayout() Me.SuspendLayout() ' 'btnEdit ' Me.btnEdit.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.btnEdit.Location = New System.Drawing.Point(976, 8) Me.btnEdit.Name = "btnEdit" Me.btnEdit.Size = New System.Drawing.Size(96, 24) Me.btnEdit.TabIndex = 1 Me.btnEdit.Text = "&Edit" ' 'btnDelete ' Me.btnDelete.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.btnDelete.Location = New System.Drawing.Point(976, 40) Me.btnDelete.Name = "btnDelete" Me.btnDelete.Size = New System.Drawing.Size(96, 24) Me.btnDelete.TabIndex = 2 Me.btnDelete.Text = "&Delete" ' 'btnExit ' Me.btnExit.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.btnExit.Location = New System.Drawing.Point(976, 72) Me.btnExit.Name = "btnExit" Me.btnExit.Size = New System.Drawing.Size(96, 24) Me.btnExit.TabIndex = 3 Me.btnExit.Text = "E&xit" ' 'fraAddEdit ' Me.fraAddEdit.Anchor = CType(((Windows.Forms.AnchorStyles.Bottom Or Windows.Forms.AnchorStyles.Left) _ Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.fraAddEdit.Controls.Add(Me.btnRevert) Me.fraAddEdit.Controls.Add(Me.btnCancel) Me.fraAddEdit.Controls.Add(Me.btnSave) Me.fraAddEdit.Location = New System.Drawing.Point(10, 320) Me.fraAddEdit.Name = "fraAddEdit" Me.fraAddEdit.Size = New System.Drawing.Size(1064, 272) Me.fraAddEdit.TabIndex = 4 Me.fraAddEdit.TabStop = False Me.fraAddEdit.Text = "Add..." ' 'btnRevert ' Me.btnRevert.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.btnRevert.Location = New System.Drawing.Point(952, 80) Me.btnRevert.Name = "btnRevert" Me.btnRevert.Size = New System.Drawing.Size(104, 24) Me.btnRevert.TabIndex = 2 Me.btnRevert.Text = "&Revert" ' 'btnCancel ' Me.btnCancel.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.btnCancel.Location = New System.Drawing.Point(952, 48) Me.btnCancel.Name = "btnCancel" Me.btnCancel.Size = New System.Drawing.Size(104, 24) Me.btnCancel.TabIndex = 1 Me.btnCancel.Text = "&Cancel" ' 'btnSave ' Me.btnSave.Anchor = CType((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.btnSave.Location = New System.Drawing.Point(952, 16) Me.btnSave.Name = "btnSave" Me.btnSave.Size = New System.Drawing.Size(104, 24) Me.btnSave.TabIndex = 0 Me.btnSave.Text = "&Save" ' 'lvwExistingItemsList ' Me.lvwExistingItemsList.Anchor = CType(((Windows.Forms.AnchorStyles.Top Or Windows.Forms.AnchorStyles.Left) _ Or Windows.Forms.AnchorStyles.Right), Windows.Forms.AnchorStyles) Me.lvwExistingItemsList.FullRowSelect = True Me.lvwExistingItemsList.GridLines = True Me.lvwExistingItemsList.HideSelection = False Me.lvwExistingItemsList.Location = New System.Drawing.Point(8, 8) Me.lvwExistingItemsList.MultiSelect = False Me.lvwExistingItemsList.Name = "lvwExistingItemsList" Me.lvwExistingItemsList.Size = New System.Drawing.Size(960, 312) Me.lvwExistingItemsList.TabIndex = 0 Me.lvwExistingItemsList.UseCompatibleStateImageBehavior = False Me.lvwExistingItemsList.View = Windows.Forms.View.Details ' 'BaseEditForm ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(1080, 598) Me.Controls.Add(Me.lvwExistingItemsList) Me.Controls.Add(Me.fraAddEdit) Me.Controls.Add(Me.btnExit) Me.Controls.Add(Me.btnDelete) Me.Controls.Add(Me.btnEdit) Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) Me.MinimumSize = New System.Drawing.Size(848, 568) Me.Name = "BaseEditForm" Me.Text = "BaseEditForm" Me.fraAddEdit.ResumeLayout(False) Me.ResumeLayout(False) End Sub #End Region Private Sub BaseEditForm_FormClosed(ByVal sender As Object, ByVal e As Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed MyGlobals.FlushCachedObjects() End Sub Private Sub BaseEditForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load If Me.DesignMode Then MessageBox.Show("The BaseEditForm class must be inherited, and contains methods that must be overridden." + vbCrLf + "They have been declared in the base class and will throw NotImplementedException at runtime if not overridden.") End If MyGlobals.FlushCachedObjects() lvwExistingItemsList.Sorting = SortOrder.None mintCurrentSortColumn = 0 mvalEditingOrAdding = EditingOrAdding.NoAction LoadExistingItemsList() InitializeDetailControls() EnableDisableControls() 'Dim lobjColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(0) 'lvwExistingItemsList_ColumnClick(Me, lobjColumnClickEventArgs) lvwExistingItemsList.Height = fraAddEdit.Top - lvwExistingItemsList.Top - 10 End Sub Protected Overridable Sub LoadExistingItemsList() If Not Me.DesignMode Then Throw New NotImplementedException End If End Sub Protected Overridable Sub InitializeDetailControls() If Not Me.DesignMode Then Throw New NotImplementedException End If End Sub Protected Overridable Sub EmptyOutDetailControls() If Not Me.DesignMode Then Throw New NotImplementedException End If End Sub Protected Overridable Function DetailControlsHaveSignificantData() As Boolean If Not Me.DesignMode Then Throw New NotImplementedException End If Return False End Function Protected Overridable Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As ListViewItem) As Boolean If Not Me.DesignMode Then Throw New NotImplementedException End If Return False End Function Protected Overridable Function DeleteExistingItem(ByVal lstvwItemToDelete As ListViewItem) As Boolean If Not Me.DesignMode Then Throw New NotImplementedException End If Return True End Function Protected Overridable Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As ListViewItem) As Boolean If Not Me.DesignMode Then Throw New NotImplementedException End If Return True End Function Protected Overridable Function SaveNewItem() As Boolean If Not Me.DesignMode Then Throw New NotImplementedException End If Return True End Function Protected Overridable Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As ListViewItem) As Boolean If Not Me.DesignMode Then Throw New NotImplementedException End If Return True End Function Protected Overridable Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As ListViewItem) As Boolean If Not Me.DesignMode Then Throw New NotImplementedException End If Return True End Function Protected Overridable Sub SetFocusToFirstDetailControlForEdit() If Not Me.DesignMode Then Throw New NotImplementedException End If End Sub Protected Overridable Sub UserRequestedToExit() If Not Me.DesignMode Then Throw New NotImplementedException End If End Sub Protected Overridable Sub EditOrAddStarting() If Not Me.DesignMode Then Throw New NotImplementedException End If End Sub Protected Overridable Sub EditOrAddCompleted() If Not Me.DesignMode Then Throw New NotImplementedException End If End Sub Protected ReadOnly Property ExistingObjectsListItems() As ListView.ListViewItemCollection Get Return lvwExistingItemsList.Items End Get End Property Protected ReadOnly Property ExistingObjectsListColumns() As ListView.ColumnHeaderCollection Get Return lvwExistingItemsList.Columns End Get End Property Protected ReadOnly Property GetEditingOrAdding() As EditingOrAdding Get Return mvalEditingOrAdding End Get End Property Protected Property MyBaseEditFormColumnSortRules() As clsGridColumnSortRule() Get Return mobjEditFormExistingItemColumnSortRules End Get Set(ByVal iValue As clsGridColumnSortRule()) mobjEditFormExistingItemColumnSortRules = iValue End Set End Property Private Sub EnableDisableControls() Select Case mvalEditingOrAdding Case EditingOrAdding.Loading Exit Sub Case EditingOrAdding.Adding, EditingOrAdding.NoAction If DetailControlsHaveSignificantData() Then If btnCancel.Enabled = False Then EditOrAddStarting() End If mvalEditingOrAdding = EditingOrAdding.Adding lvwExistingItemsList.Enabled = False btnEdit.Enabled = False btnDelete.Enabled = False btnExit.Enabled = False fraAddEdit.Text = "Add..." btnSave.Enabled = True btnCancel.Enabled = True btnRevert.Enabled = False Else If btnCancel.Enabled = True Then EditOrAddCompleted() End If mvalEditingOrAdding = EditingOrAdding.NoAction lvwExistingItemsList.Enabled = True btnEdit.Enabled = True btnDelete.Enabled = True btnExit.Enabled = True fraAddEdit.Text = "Add..." btnSave.Enabled = False btnCancel.Enabled = False btnRevert.Enabled = False End If Case EditingOrAdding.Editing If btnCancel.Enabled = False Then EditOrAddStarting() End If lvwExistingItemsList.Enabled = False btnEdit.Enabled = False btnDelete.Enabled = False btnExit.Enabled = False fraAddEdit.Text = "Edit..." btnCancel.Enabled = True If DetailControlsHaveDifferentDataThanExistingData(lvwExistingItemsList.SelectedItems(0)) Then btnSave.Enabled = True btnRevert.Enabled = True Else btnSave.Enabled = False btnRevert.Enabled = False End If End Select If Not Me.DesignMode Then If btnCancel.Enabled Then Me.CancelButton = btnCancel Else Me.CancelButton = Nothing End If If btnSave.Enabled Then Me.AcceptButton = btnSave Else Me.AcceptButton = Nothing End If End If End Sub Private Sub btnEdit_Click1(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnEdit.Click DoEditClick() End Sub Private Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click If lvwExistingItemsList.SelectedItems.Count = 0 Then MessageBox.Show("Must select an item to delete", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If If ConfirmOKToDeleteExistingItem(lvwExistingItemsList.SelectedItems(0)) Then If DeleteExistingItem(lvwExistingItemsList.SelectedItems(0)) Then lvwExistingItemsList.Items.Remove(lvwExistingItemsList.SelectedItems(0)) End If End If End Sub Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click EmptyOutDetailControls() mvalEditingOrAdding = EditingOrAdding.NoAction EnableDisableControls() SetFocusToFirstDetailControlForEdit() End Sub Private Sub btnRevert_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRevert.Click LoadExistingDataToDetailControls(lvwExistingItemsList.SelectedItems(0)) SetFocusToFirstDetailControlForEdit() End Sub Private Sub btnSave_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.Click If mvalEditingOrAdding = EditingOrAdding.Adding Then If SaveNewItem() Then mvalEditingOrAdding = EditingOrAdding.NoAction EmptyOutDetailControls() EnableDisableControls() End If Else If SaveNewDataForExistingItem(lvwExistingItemsList.SelectedItems(0)) Then mvalEditingOrAdding = EditingOrAdding.NoAction EmptyOutDetailControls() EnableDisableControls() End If End If SetFocusToFirstDetailControlForEdit() End Sub Private Sub DoEditClick() If lvwExistingItemsList.SelectedItems.Count = 0 Then MessageBox.Show("Must select an item to edit", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) Exit Sub End If mvalEditingOrAdding = EditingOrAdding.Loading If LoadExistingDataToDetailControls(lvwExistingItemsList.SelectedItems(0)) Then mvalEditingOrAdding = EditingOrAdding.Editing EnableDisableControls() Else mvalEditingOrAdding = EditingOrAdding.NoAction EmptyOutDetailControls() Exit Sub End If End Sub Protected Sub DetailDataHasChanged() EnableDisableControls() End Sub Private Sub btnExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnExit.Click UserRequestedToExit() End Sub Private Sub lvwExistingItemsList_ColumnClick(ByVal sender As System.Object, ByVal e As Windows.Forms.ColumnClickEventArgs) Handles lvwExistingItemsList.ColumnClick mintCurrentSortColumn = e.Column lvwExistingItemsList.ListViewItemSorter = New clsGridSorter(e.Column, mobjEditFormExistingItemColumnSortRules) End Sub Private Sub lvwExistingItemsList_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles lvwExistingItemsList.DoubleClick DoEditClick() End Sub Private Sub BaseEditForm_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize lvwExistingItemsList.Height = fraAddEdit.Top - lvwExistingItemsList.Top - 10 End Sub Private Sub fraAddEdit_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles fraAddEdit.Resize lvwExistingItemsList.Height = fraAddEdit.Top - lvwExistingItemsList.Top - 10 End Sub Private Sub BaseEditForm_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown If mobjEditFormExistingItemColumnSortRules Is Nothing Then Exit Sub End If Dim intSavedSortColumn As Integer = mintCurrentSortColumn 'If there is more than one column, temporarily sort by some other column 'This is because, when first shown, for some reason, it was sorting only by the first 'column, with no subsorts. I'm not sure if this is because .NET thinks that we're already 'sorted by the first column. If mobjEditFormExistingItemColumnSortRules.Length > 1 Then Dim intTempSortColumn As Integer If mintCurrentSortColumn = 0 Then intTempSortColumn = 1 Else intTempSortColumn = 0 End If Dim lobjTempColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(intTempSortColumn) lvwExistingItemsList_ColumnClick(Me, lobjTempColumnClickEventArgs) End If 'Sort by the current column Dim lobjColumnClickEventArgs As New Windows.Forms.ColumnClickEventArgs(intSavedSortColumn) lvwExistingItemsList_ColumnClick(Me, lobjColumnClickEventArgs) End Sub Public Sub ExistingItemsListSuspendLayout() lvwExistingItemsList.SuspendLayout() End Sub Public Sub ExistingItemsListResumeLayout() lvwExistingItemsList.ResumeLayout() End Sub End Class