Imports System.Windows.Forms Public Class frmEditHymn Private mobjDetailHymn As New clsHymn Private m_objHymnTuneNamesHash As Hashtable Protected Overrides Sub LoadExistingItemsList() Dim lobjHymn As clsHymn Dim lobjHymns As System.Collections.Generic.List(Of clsHymn) SetUpExistingItemsHeaders() lobjHymns = clsHymn.GetAllHymns Me.ExistingItemsListSuspendLayout() For Each lobjHymn In lobjHymns Me.ExistingObjectsListItems.Add(ConvertHymnToListViewItem(lobjHymn)) Next Me.ExistingItemsListResumeLayout() End Sub Private Sub SetUpExistingItemsHeaders() Me.ExistingObjectsListColumns.Add("Hymnal", 100, HorizontalAlignment.Left) Me.ExistingObjectsListColumns.Add("Hymn Number", 100, HorizontalAlignment.Left) Me.ExistingObjectsListColumns.Add("Hymn Name", 400, HorizontalAlignment.Left) Me.ExistingObjectsListColumns.Add("Hymn Tune Name", 200, HorizontalAlignment.Left) 'Set up sorting rules Dim lobjBaseEditFormColumnSortRules(3) As clsGridColumnSortRule 'First column, sort by Hymnal, then Hymn Number lobjBaseEditFormColumnSortRules(0) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(0).SubColumnSort = New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing) 'Second column, sort by Hymnal, then Hymn Number lobjBaseEditFormColumnSortRules(1) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortNone) lobjBaseEditFormColumnSortRules(1).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing)) 'Third column, sort by Hymn name, then Hymnal and Hymn Number lobjBaseEditFormColumnSortRules(2) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(2).SubColumnSort = New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing)) 'Fourth column, sort by Hymn Tune name, then Hymn Name, Hymnal and Hymn Number lobjBaseEditFormColumnSortRules(3) = New clsGridColumnSortRule(clsGridColumnSortRule.enumSortType.SortAsString) lobjBaseEditFormColumnSortRules(3).SubColumnSort = New clsGridSubColumnSortRule(2, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(0, clsGridSubColumnSortRule.enumSortType.SortAsString, New clsGridSubColumnSortRule(1, clsGridSubColumnSortRule.enumSortType.SortAsNumber, Nothing))) MyBaseEditFormColumnSortRules = lobjBaseEditFormColumnSortRules End Sub Protected Overrides Sub InitializeDetailControls() 'Load data to detail controls here at form load time txtHymnName.MaxLength = MyGlobals.HYMN_NAME_SIZE cboHymnTuneName.MaxLength = MyGlobals.HYMN_TUNE_NAME_SIZE txtHymnNumber.Text = "" txtHymnName.Text = "" 'Only set up hymnal if first time in If cboHymnal.Items.Count = 0 Then Dim objHymnal As clsHymnal Dim objHymnals As System.Collections.Generic.List(Of clsHymnal) Me.cboHymnal.Items.Clear() objHymnals = clsHymnal.GetAllHymnals For Each objHymnal In objHymnals Me.cboHymnal.Items.Add(objHymnal) Next 'Select first hymnal if there is one If Me.cboHymnal.Items.Count > 0 Then Me.cboHymnal.SelectedIndex = 0 End If End If If cboHymnTuneName.Items.Count = 0 Then Dim objHymnTuneName As clsHymnTuneName Dim objHymnTuneNames As System.Collections.Generic.List(Of clsHymnTuneName) 'Dim objObject As Object Me.cboHymnTuneName.Items.Clear() m_objHymnTuneNamesHash = New Hashtable objHymnTuneNames = clsHymnTuneName.GetAllHymnTuneNames For Each objHymnTuneName In objHymnTuneNames AddHymnTuneNameToForm(objHymnTuneName) Next End If End Sub Protected Overrides Sub SetFocusToFirstDetailControlForEdit() cboHymnal.Focus() End Sub Protected Overrides Function DetailControlsHaveDifferentDataThanExistingData(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean Dim lobjSavedHymn As clsHymn Dim lblnReturnValue As Boolean = False lobjSavedHymn = CType(lstvwExistingItem.Tag, clsHymn) Dim objHymnTuneName As clsHymnTuneName Select Case cboHymnTuneName.Text.ToUpper.Trim Case MyGlobals.NONE_STRING.ToUpper, "" objHymnTuneName = Nothing Case Else objHymnTuneName = CType(MyGlobals.GetItemFromHashWithStringKey(cboHymnTuneName.Text.ToUpper.Trim, m_objHymnTuneNamesHash), clsHymnTuneName) If objHymnTuneName Is Nothing Then objHymnTuneName = New clsHymnTuneName(cboHymnTuneName.Text.Trim) End If End Select mobjDetailHymn.HymnNumberAsString = txtHymnNumber.Text mobjDetailHymn.HymnName = txtHymnName.Text mobjDetailHymn.Hymnal = CType(cboHymnal.SelectedItem, clsHymnal) mobjDetailHymn.HymnTuneName = objHymnTuneName If lobjSavedHymn.StateIsIdentical(mobjDetailHymn) Then Return False Else Return True End If End Function Protected Overrides Function DetailControlsHaveSignificantData() As Boolean If txtHymnName.Text.Trim.Length > 0 _ OrElse txtHymnNumber.Text.Trim.Length > 0 Then Return True End If Return False End Function Protected Overrides Sub EmptyOutDetailControls() InitializeDetailControls() txtHymnNumber.Text = "" txtHymnName.Text = "" cboHymnTuneName.Text = "" mobjDetailHymn = New clsHymn End Sub Protected Overrides Function LoadExistingDataToDetailControls(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean Dim lobjHymn As clsHymn Dim lblnReturnValue As Boolean = False lobjHymn = CType(lstvwExistingItem.Tag, clsHymn) txtHymnNumber.Text = lobjHymn.HymnNumberAsString txtHymnName.Text = lobjHymn.HymnName cboHymnal.Text = lobjHymn.Hymnal.ToString If lobjHymn.HymnTuneName Is Nothing Then cboHymnTuneName.Text = MyGlobals.NONE_STRING Else cboHymnTuneName.Text = lobjHymn.HymnTuneName.HymnTuneName End If mobjDetailHymn = CType(lobjHymn.Clone(), clsHymn) Return True End Function Protected Overrides Function ConfirmOKToDeleteExistingItem(ByVal lstvwItemToDelete As System.Windows.Forms.ListViewItem) As Boolean Dim lobjHymn As clsHymn Dim lstrReferencedBy As String = "" lobjHymn = CType(lstvwItemToDelete.Tag, clsHymn) If Not lobjHymn.OKToDelete(lstrReferencedBy) Then MessageBox.Show("Can't delete hymn: " + lobjHymn.ToString + ". Currently used by " + lstrReferencedBy + ".", "Unable to delete", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) Return False End If Dim ldrDialogResult As DialogResult = MessageBox.Show("Are you sure you want to delete hymn: " + lobjHymn.ToString + "?", "Delete confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) If ldrDialogResult = System.Windows.Forms.DialogResult.No Then Return False End If Return True End Function Protected Overrides Function DeleteExistingItem(ByVal lstvwItemToDelete As System.Windows.Forms.ListViewItem) As Boolean Dim lobjHymn As clsHymn lobjHymn = CType(lstvwItemToDelete.Tag, clsHymn) Return lobjHymn.Delete() End Function Protected Overrides Function SaveNewItem() As Boolean Dim lstrErrorString As String = "" Dim lblnAddedNewHymnTuneName As Boolean lblnAddedNewHymnTuneName = False Dim objHymnTuneName As clsHymnTuneName Select Case cboHymnTuneName.Text.ToUpper.Trim Case MyGlobals.NONE_STRING.ToUpper, "" objHymnTuneName = Nothing Case Else objHymnTuneName = CType(MyGlobals.GetItemFromHashWithStringKey(cboHymnTuneName.Text.ToUpper.Trim, m_objHymnTuneNamesHash), clsHymnTuneName) If objHymnTuneName Is Nothing Then objHymnTuneName = New clsHymnTuneName(cboHymnTuneName.Text.Trim) lblnAddedNewHymnTuneName = True End If End Select mobjDetailHymn.HymnNumberAsString = txtHymnNumber.Text mobjDetailHymn.HymnName = txtHymnName.Text mobjDetailHymn.Hymnal = CType(cboHymnal.SelectedItem, clsHymnal) mobjDetailHymn.HymnTuneName = objHymnTuneName If Not mobjDetailHymn.Validate(lstrErrorString) Then MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning) Return False End If If Not mobjDetailHymn.Save() Then Return False End If Me.ExistingObjectsListItems.Add(ConvertHymnToListViewItem(mobjDetailHymn)) If lblnAddedNewHymnTuneName Then AddHymnTuneNameToForm(objHymnTuneName) End If Return True End Function Protected Overrides Sub UserRequestedToExit() Me.Close() End Sub Protected Overrides Sub EditOrAddStarting() CType(Me.ParentForm, frmMain).DisableMenus() End Sub Protected Overrides Sub EditOrAddCompleted() CType(Me.ParentForm, frmMain).EnableMenus() End Sub Private Function ConvertHymnToListViewItem(ByVal lobjHymn As clsHymn) As ListViewItem Dim lobjItem As ListViewItem If lobjHymn.Hymnal Is Nothing Then lobjItem = New ListViewItem("") Else lobjItem = New ListViewItem(lobjHymn.Hymnal.HymnalAbbreviation) End If lobjItem.SubItems.Add(lobjHymn.HymnNumberAsString) lobjItem.SubItems.Add(lobjHymn.HymnName) If lobjHymn.HymnTuneName Is Nothing Then lobjItem.SubItems.Add(MyGlobals.NONE_STRING) Else lobjItem.SubItems.Add(lobjHymn.HymnTuneName.HymnTuneName) End If lobjItem.Tag = lobjHymn Return lobjItem End Function Protected Overrides Function SaveNewDataForExistingItem(ByVal lstvwExistingItem As System.Windows.Forms.ListViewItem) As Boolean Dim lstrErrorString As String = "" Dim lblnAddedNewHymnTuneName As Boolean lblnAddedNewHymnTuneName = False Dim objHymnTuneName As clsHymnTuneName Select Case cboHymnTuneName.Text.ToUpper.Trim Case MyGlobals.NONE_STRING.ToUpper, "" objHymnTuneName = Nothing Case Else objHymnTuneName = CType(MyGlobals.GetItemFromHashWithStringKey(cboHymnTuneName.Text.ToUpper.Trim, m_objHymnTuneNamesHash), clsHymnTuneName) If objHymnTuneName Is Nothing Then objHymnTuneName = New clsHymnTuneName(cboHymnTuneName.Text.Trim) lblnAddedNewHymnTuneName = True End If End Select mobjDetailHymn.HymnNumberAsString = txtHymnNumber.Text mobjDetailHymn.HymnName = txtHymnName.Text mobjDetailHymn.Hymnal = CType(cboHymnal.SelectedItem, clsHymnal) mobjDetailHymn.HymnTuneName = objHymnTuneName If Not mobjDetailHymn.Validate(lstrErrorString) Then MessageBox.Show(lstrErrorString, "Edit Error", MessageBoxButtons.OK, MessageBoxIcon.Warning) Return False End If If Not mobjDetailHymn.Save() Then Return False End If Me.ExistingObjectsListItems.Remove(lstvwExistingItem) Me.ExistingObjectsListItems.Add(ConvertHymnToListViewItem(mobjDetailHymn)) If lblnAddedNewHymnTuneName Then AddHymnTuneNameToForm(objHymnTuneName) End If Return True End Function Private Sub txtHymnName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHymnName.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub cboHymnTuneName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboHymnTuneName.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub txtHymnNumber_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtHymnNumber.TextChanged MyBase.DetailDataHasChanged() End Sub Private Sub cboHymnal_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboHymnal.SelectedIndexChanged MyBase.DetailDataHasChanged() End Sub Private Sub txtHymnNumber_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtHymnNumber.KeyPress If Not MyGlobals.AllowKeypressInNumericTextBox(e.KeyChar) Then e.Handled = True End If End Sub Protected Sub AddHymnTuneNameToForm(ByVal objHymnTuneName As clsHymnTuneName) Me.cboHymnTuneName.Items.Add(objHymnTuneName.HymnTuneName) m_objHymnTuneNamesHash.Add(objHymnTuneName.HymnTuneName.ToUpper, objHymnTuneName) End Sub End Class