ordersform.vb

来自「wrox出版社的另一套经典的VB2005数据库编程学习书籍,收集了书中源码,郑重」· VB 代码 · 共 1,404 行 · 第 1/4 页

VB
1,404
字号
                        End If
                    Next
                End With
                btnSaveOrders.Enabled = False
                btnCancelOrderEdits.Enabled = False
            Else
                MsgBox("Customer " + cboCustomerID.Text + " not found.", _
                 MsgBoxStyle.Exclamation, strTitle)
                cboCustomerID.Focus()
            End If
        Catch exc As Exception
            MsgBox(exc.Message + exc.StackTrace, MsgBoxStyle.Information, "GetOrders Exception")
        End Try
    End Sub

    Private Sub SetOrdersReadOnly()
        'For all customer orders shipped
        EnableOrdersGrid(True, True)
        EnableOrder_DetailsGrid(True, True)
        btnEditOrders.Enabled = False
        btnSaveOrders.Enabled = False
        btnCancelOrderEdits.Enabled = False
    End Sub

    Private Sub btnEditCustData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEditCustData.Click
        'Enable the Customers text boxes and buttons
        LockCustTextBoxes(False, True)
        ShowCustomerEditButtons(True)
        btnSaveCustData.Enabled = True
        btnCancelCustEdit.Enabled = True
        btnNewCustomer.Enabled = False
        btnGetOrders.Enabled = False
    End Sub
#End Region

#Region "New Customer and Related Event Handlers"
    '**************************************************************
    'Event handlers and procedures for adding a new customer record
    '**************************************************************

    Private Sub btnNewCustomer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnNewCustomer.Click
        'Execute only if no changes pending
        If NorthwindDataSet.HasChanges Then
            Dim strMsg As String = "You must save all pending changes before adding a new customer."
            MsgBox(strMsg, MsgBoxStyle.Exclamation, strTitle)
        End If
        'Clear the dataset to remove previous GetOrders data
        NorthwindDataSet.Clear()
        'Add a new customer record
        CustomersBindingSource.AddNew()
        'Clear the text boxes
        ClearCustomerTextBoxes()
        'Hide the grids 
        ShowGrids(False)
        LockCustTextBoxes(False, False)
        lblHelp.Visible = False
        'Command button setup
        ShowOrdersEditButtons(False)
        ShowCustomerEditButtons(True)
        btnNewCustomer.Enabled = False
        btnEditCustData.Enabled = False
        btnGetOrders.Enabled = False
        btnSaveCustData.Enabled = False
        btnCancelCustEdit.Enabled = True
        btnNewOrder.Enabled = False
        blnIsNewCustomer = True
        If blnUseSampleData Then
            SampleNewCustomerData()
        End If
        CompanyNameTextBox.Focus()
    End Sub

    Private Sub ClearCustomerTextBoxes()
        'Clear all text boxes
        CustomerIDTextBox.Text = ""
        CompanyNameTextBox.Text = ""
        ContactNameTextBox.Text = ""
        ContactTitleTextBox.Text = ""
        AddressTextBox.Text = ""
        CityTextBox.Text = ""
        RegionTextBox.Text = ""
        PostalCodeTextBox.Text = ""
        CountryTextBox.Text = ""
        PhoneTextBox.Text = ""
        FaxTextBox.Text = ""
    End Sub

    Private Sub btnSaveCustData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSaveCustData.Click
        'TODO: Test for all required entries
        If blnIsNewCustomer Then
            clsCancelNew.EndNew(CustomersBindingSource.Position)
        Else
            CustomersBindingSource.EndEdit()
        End If
        'V3Final: Update customers table
        If UpdateBaseTables(False) Then
            Try
                CustomersTableAdapter.Update(NorthwindDataSet.Customers)
            Catch exConcur As DBConcurrencyException
                'Ignore the exception
            Catch exSys As System.Exception
                MsgBox(exSys.Message, MsgBoxStyle.Exclamation, "Update System Exception")
            End Try
        Else
            Return
        End If
        If blnIsNewCustomer Then
            'Enable entering a new order after saving a new customer
            ShowOrdersEditButtons(True)
            If blnUseTabs Then
                OrdersDataGridView.Visible = True
                lblOrdersGrid.Visible = True
                chkTabPageEdit.Visible = True
                pagEditOrder.Text = "Edit New Order"
                txtHelp.Visible = False
            Else
                ShowGrids(True)
            End If
            EnableOrdersGrid(True, False)
            EnableOrder_DetailsGrid(True, False)
            'Add a new order for the customer
            btnNewOrder_Click(Nothing, Nothing)
            blnIsNewCustomer = False
        End If
        SaveOrCancelCustDataButtons()
    End Sub

    Private Sub btnCancelCustEdit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancelCustEdit.Click
        'Undo the customer edits
        'For testing
        Dim intCtr As Integer = CustomersBindingSource.Count
        If blnIsNewCustomer And bsCustsLookup.Count > 0 Then
            'Remove the added (last) record
            'CustomersBindingSource.removeat
            bsCustsLookup.RemoveAt(bsCustsLookup.Count - 1)
            ClearCustomerTextBoxes()
            'CustomersBindingSource.CancelEdit()
            clsCancelNew.CancelNew(CustomersBindingSource.Position)
            blnIsNewCustomer = False
        Else
            CustomersBindingSource.CancelEdit()
        End If
        'For testing
        intCtr = CustomersBindingSource.Count
        SaveOrCancelCustDataButtons()
    End Sub

    Private Sub SaveOrCancelCustDataButtons()
        'Button and text box setup after save or cancel
        btnNewCustomer.Enabled = True
        btnSaveCustData.Enabled = False
        btnCancelCustEdit.Enabled = False
        btnGetOrders.Enabled = True
        btnNewOrder.Enabled = True
        LockCustTextBoxes(True, True)
    End Sub

    Private Sub ContactNameTextBox_GotFocus(ByVal sender As Object, _
     ByVal e As System.EventArgs) Handles ContactNameTextBox.GotFocus
        If blnIsNewCustomer Then
            If Len(CompanyNameTextBox.Text) > 3 Then
                'Compute a five-character CustomerID
                cboCustomerID.Text = ""
                With CompanyNameTextBox
                    If InStr(.Text, " ") > 0 Then
                        Dim intPos As Integer
                        intPos = InStr(.Text, " ")
                        strCustID = UCase(Mid(.Text, 1, intPos - 1))
                        If Len(strCustID) > 4 Then
                            strCustID = Mid(strCustID, 1, 4)
                        End If
                        'Add to create 5 characters
                        strCustID += UCase(Mid(.Text, intPos + 1, 5 - Len(strCustID)))
                        strCustID = Replace(strCustID, " ", "")
                        'Remove acutes, punctuation, and non-USASCII characters
                        Dim strChars As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
                        Dim strChar As String = Nothing
                        Dim intCtr As Integer
                        For intCtr = 1 To Len(.Text)
                            strChar = Mid(strCustID, intCtr, 1)
                            If InStr(strChars, strChar) = 0 Then
                                strCustID = Replace(strCustID, strChar, "X")
                            End If
                        Next intCtr
                        'Test for five remaining characters (e.g, Company name = "El Al")
                        If Len(strCustID) < 5 Then
                            strCustID += "XXXXX"
                            strCustID = Mid$(strCustID, 1, 5)
                        End If
                    Else
                        strCustID = UCase(Mid(.Text, 1, 5))
                    End If
                End With
                'Test for duplicate CustomerID
                'In a production application, an InputBox would allow the
                'user to change strCustID and test again for a duplicate.
                With cboCustomerID
                    Dim strHelp As String = vbCrLf + vbCrLf + _
                     "(Change 'Systems' to 'Enterprises' or the like to add the customer.)"
                    Dim blnIsDup As Boolean
                    Dim intCtr As Integer
                    'V3Final: Can't search combo box items when bound to a DataTable
                    'If Mid(.Items(intCtr).ToString, 1, 5) = strCustID Then
                    'Returns "System.Windows.Forms.ComboBox, Items.Count = 94"
                    For intCtr = 0 To .Items.Count - 1
                        Dim drvCustID As DataRowView = CType(.Items(intCtr), DataRowView)
                        With drvCustID.Row
                            If .Item(0).ToString = strCustID Then
                                CompanyNameTextBox.Focus()
                                Dim strMsg As String = "CustomerID '" + strCustID + _
                                 "' duplicates existing entry '" + .Item(1).ToString + "." + strHelp
                                MsgBox(strMsg, MsgBoxStyle.Exclamation, strTitle)
                                blnIsDup = True
                                Exit For
                            End If
                        End With
                    Next intCtr
                    'V3Final: Added server test for duplicate
                    If Not blnIsDup Then
                        'Function is in OrderFormV3.vb
                        blnIsDup = CheckServerForCustID(strCustID)
                        If blnIsDup Then
                            CompanyNameTextBox.Focus()
                            Dim strMsg As String = "CustomerID '" + strCustID + _
                              "' duplicates existing entry in Customers table." + strHelp
                            MsgBox(strMsg, MsgBoxStyle.Exclamation, strTitle)
                        End If
                    End If
                    If blnIsDup Then
                        Exit Sub
                    End If
                    'V3Final: Can't add items to a databound list
                    '.Items.Add(strCustID + " - " + CompanyNameTextBox.Text)
                    'Add new table row
                    Dim objNewRow As Object = bsCustsLookup.AddNew()
                    Dim drvNewRow As DataRowView = CType(objNewRow, DataRowView)
                    With drvNewRow
                        .Item(0) = strCustID
                        .Item(1) = strCustID + " - " + CompanyNameTextBox.Text
                        .EndEdit()
                    End With
                    .SelectedIndex = .Items.Count - 1
                    'Delete the saved DataSet file to refresh lookups in next session
                    Dim strFile As String = Application.StartupPath + _
                     "\LookupsDataSet.xml"
                    If File.Exists(strFile) Then
                        File.Delete(strFile)
                    End If
                End With
                CustomerIDTextBox.Text = Mid(cboCustomerID.Text, 1, 5)
                LockCustTextBoxes(False, True)
                'Button setup
                btnEditCustData.Enabled = True
                btnSaveCustData.Enabled = True
                btnCancelCustEdit.Enabled = True
            Else
                CompanyNameTextBox.Focus()
                Dim strMsg As String = "CompanyName is required and must have more than three characters."
                MsgBox(strMsg, MsgBoxStyle.Exclamation, strTitle)
            End If
        End If
    End Sub
#End Region

#Region "Orders Buttons Event Handlers"
    '**************************************
    'Orders edit buttons event handlers: 
    'btnEditOrders, btnNewOrder, 
    'btnSaveOrderEdits, btnCancelOrderEdits
    '**************************************

    Private Sub btnEditOrders_Click(ByVal sender As System.Object, _
     ByVal e As System.EventArgs) Handles btnEditOrders.Click
        'Enable the DataGridView controls
        EnableOrdersGrid(True, False)
        EnableOrder_DetailsGrid(True, False)
        btnSaveOrders.Enabled = True
        btnCancelOrderEdits.Enabled = True
        With OrdersDataGridView
            'Set the focus to the first row
            .CurrentCell = .Rows(0).Cells(0)
            .Focus()
        End With
    End Sub

    Private Sub btnNewOrder_Click(ByVal sender As System.Object, _
     ByVal e As System.EventArgs) Handles btnNewOrder.Click
        'Add a new Orders row programmatically
        EnableOrdersGrid(True, False)
        With OrdersBindingSource
            .AddNew()
            .MoveLast()
        End With
        With OrdersDataGridView
            .Focus()
            'Rows.Count includes the default new row
            Dim rowAdded As DataGridViewRow = .Rows(.Rows.Count - 2)
            'Add the default values
            SetDefaultOrderValues(rowAdded)
        End With
        blnIsNewOrderRow = True
        btnCancelOrderEdits.Enabled = True
        btnSaveOrders.Enabled = False
        'Add a new OrderDetails row
        EnableOrder_DetailsGrid(True, False)
        With FK_Order_Details_OrdersBindingSource
            .AddNew()
            .MoveLast()
        End With
        With Order_DetailsDataGridView
            Dim rowAdded As DataGridViewRow = .Rows(.Rows.Count - 2)
            'Add the default values
            SetDefaultDetailsValues(rowAdded)
        End With
        btnNewOrder.Enabled = False
        If blnUseTabs Then
            If tabOrders.TabPages.Count = 1 Then
                tabOrders.TabPages.Add(pagEditOrder)
            End If
            tabOrders.SelectedTab = pagEditOrder
            'blnIsNewOrderRow = False
            EmployeeIDTextBox.Focus()
        End If
        pagEditOrder.Text = "Edit New Order"
    End Sub

    Private Sub btnSaveOrders_Click(ByVal sender As System.Object, _
     ByVal e As System.EventArgs) Handles btnSaveOrders.Click
        'TODO: Save changes to Orders and Order Details tables
        Try
            'V3Final: Enforce business rules
            'Test for at least one line item
            Dim strMsg As String
            If Order_DetailsBindingSource.Count < 1 Then
                strMsg = "An new order must have at least one line item. " + _
                 "Please add a line item or click Cancel All Changes."
                MsgBox(strMsg, MsgBoxStyle.Exclamation, strTitle)
                Return
            End If
            'Test for $0.00 as UnitPrice
            Dim intRow As Integer
            strMsg = "A UnitPrice of $0.00 isn't permitted. Please edit line "
            With Order_DetailsDataGridView1
                For intRow = 0 To .Rows.Count - 2
                    If CDec(.Rows(intRow).Cells(3).Value) = 0D Then
                        strMsg += (intRow + 1).ToString + "."
                        MsgBox(strMsg, MsgBoxStyle.Exclamation, strTitle)
                        Return
                    End If
                Next
            End With

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?