2012-10-12 2 views
0

Прощайте,Почему моя форма исчезает, когда я нажимаю ENTER?

Я испытываю очень странное событие, которое только начал происходит. Всякий раз, когда я нажимаю кнопку ENTER на моей клавиатуре, я ожидаю, что событие KeyDown моего текстового поля будет поднято, и соответствующий код будет запущен. Вместо этого форма исчезает (как если бы был вызван метод .Hide()). Когда я отлаживаю, я вижу, что код, который должен запускаться после события KeyDown, создается соответствующим образом, но форма просто исчезает.

Я никогда не сталкивался с этим раньше, поэтому я не знаю, что делать. Любая помощь будет оценена по достоинству. Благодарю.

ВОТ КОД МОЕЙ ФОРМЫ:

Imports System.Net 
Imports MySql.Data 
Imports MySql.Data.MySqlClient 

Public Class FormAdd 

#Region "VARIABLE DECLARATIONS CODE" 

'FOR MySQL DATABASE USE 
Public dbConn As MySqlConnection 

'FOR CARD NUMBER FORMATTING 
Private CF As New CardFormatter 

'FOR CARD ENCRYPTION 
Dim DES As New System.Security.Cryptography.TripleDESCryptoServiceProvider 
Dim Hash As New System.Security.Cryptography.MD5CryptoServiceProvider 
Dim encryptedCard As String 

#End Region 

#Region "SUB-ROUTINES AND FUNCTIONS" 

Private Sub GetDBdata() 

    Try 
     If TextBoxAccount.Text = "" Then 
      MessageBox.Show("Sorry, you must enter an ACCOUNT# before proceeding!") 
      TextBoxAccount.Focus() 
     Else 
      dbConn = New MySqlConnection 
      dbConn.ConnectionString = String.Format("Server={0};Port={1};Uid={2};Password={3};Database=accounting", FormLogin.ComboBoxServerIP.SelectedItem, My.Settings.DB_Port, My.Settings.DB_UserID, My.Settings.DB_Password) 
      If dbConn.State = ConnectionState.Open Then 
       dbConn.Close() 
      End If 
      dbConn.Open() 
      Dim dbAdapter As New MySqlDataAdapter("SELECT * FROM customer WHERE accountNumber = " & TextBoxAccount.Text, dbConn) 
      Dim dbTable As New DataTable 
      dbAdapter.Fill(dbTable) 
      If dbTable.Rows.Count > 0 Then 
       'MessageBox.Show("Customer Account Found!") 
       Call recordFound() 
       TextBoxLastName.Text = dbTable.Rows(0).Item("nameLAST") 
       TextBoxFirstName.Text = dbTable.Rows(0).Item("nameFIRST") 
       TextBoxSalutation.Text = dbTable.Rows(0).Item("nameSALUTATION") 
       TextBoxCompanyName.Text = dbTable.Rows(0).Item("nameCOMPANY") 
      Else 
       'MessageBox.Show("No Customer Records Found! Please try again!") 
       Call recordNotFound() 
       ButtonReset.PerformClick() 
      End If 
      dbConn.Close() 
     End If 
    Catch ex As Exception 
     MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _ 
         vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.") 
    End Try 
    Dispose() 

End Sub 

Private Sub SetDBData() 

    Try 
     dbConn = New MySqlConnection 
     dbConn.ConnectionString = String.Format("Server={0};Port={1};Uid={2};Password={3};Database=accounting", FormLogin.ComboBoxServerIP.SelectedItem, My.Settings.DB_Port, My.Settings.DB_UserID, My.Settings.DB_Password) 
     Dim noCard As Boolean = True 
     If dbConn.State = ConnectionState.Open Then 
      dbConn.Close() 
     End If 
     dbConn.Open() 
     Dim dbQuery As String = "SELECT * FROM cc_master WHERE ccNumber = '" & TextBoxCard.Text & "';" 
     Dim dbData As MySqlDataReader 
     Dim dbAdapter As New MySqlDataAdapter 
     Dim dbCmd As New MySqlCommand 
     dbCmd.CommandText = dbQuery 
     dbCmd.Connection = dbConn 
     dbAdapter.SelectCommand = dbCmd 
     dbData = dbCmd.ExecuteReader 
     While dbData.Read() 
      If dbData.HasRows() = True Then 
       MessageBox.Show("This Credit/Debit Card Already Exists! Try Another!") 
       noCard = False 
      Else 
       noCard = True 
      End If 
     End While 
     dbData.Close() 
     If noCard = True Then 
      'PERFORM CARD ENCRYPTION 


      'PERFORM DATABASE SUBMISSION 
      Dim dbQuery2 As String = "INSERT INTO cc_master (ccType, ccNumber, ccExpireMonth, ccExpireYear, ccZipcode, ccCode, ccAuthorizedUseStart, ccAuthorizedUseEnd, customer_accountNumber)" & _ 
       "VALUES('" & ComboBoxCardType.SelectedItem & "','" & TextBoxCard.Text & "','" & TextBoxExpireMonth.Text & "','" & TextBoxExpireYear.Text & _ 
       "','" & TextBoxZipCode.Text & "','" & TextBoxCVV2.Text & "','" & Format(DateTimePickerStartDate.Value, "yyyy-MM-dd HH:MM:ss") & "','" & Format(DateTimePickerEndDate.Value, "yyyy-MM-dd HH:MM:ss") & "','" & TextBoxAccount.Text & "');" 
      Dim dbData2 As MySqlDataReader 
      Dim dbAdapter2 As New MySqlDataAdapter 
      Dim dbCmd2 As New MySqlCommand 
      dbCmd2.CommandText = dbQuery2 
      dbCmd2.Connection = dbConn 
      dbAdapter2.SelectCommand = dbCmd2 
      dbData2 = dbCmd2.ExecuteReader 
      MessageBox.Show("Credit/Debit Card Information Saved SUCCESSFULLY!") 
      ButtonReset.PerformClick() 
     End If 
     dbConn.Close() 
    Catch ex As Exception 
     MessageBox.Show("A DATABASE ERROR HAS OCCURED" & vbCrLf & vbCrLf & ex.Message & vbCrLf & _ 
         vbCrLf + "Please report this to the IT/Systems Helpdesk at Ext 131.") 
    End Try 
    Dispose() 

End Sub 

Private Sub ResetForm() 
    TextBoxAccount.Clear() 
    TextBoxLastName.Clear() 
    TextBoxFirstName.Clear() 
    TextBoxSalutation.Clear() 
    TextBoxCard.Clear() 
    ComboBoxCardType.SelectedItem = "" 
    TextBoxCompanyName.Clear() 
    TextBoxCVV2.Clear() 
    TextBoxExpireMonth.Clear() 
    TextBoxExpireYear.Clear() 
    TextBoxZipCode.Clear() 
    CheckBoxConfirm.Checked = False 
    TextBoxAccount.SelectionStart = 0 
    TextBoxAccount.SelectionLength = Len(TextBoxAccount.Text) 
    TextBoxAccount.Focus() 
    GroupBoxInputError.Hide() 
    LabelInstruction.Show() 
    GroupBox1.Height = 75 


End Sub 

Private Sub recordFound() 

    GroupBoxInputError.Text = "" 
    LabelError.BackColor = Color.Green 
    LabelError.ForeColor = Color.White 
    LabelError.Text = "RECORD FOUND!" 
    GroupBoxInputError.Visible = True 
    GroupBox1.Height = 345 
    ButtonReset.Show() 
    LabelInstruction.Hide() 
    ComboBoxCardType.Focus() 

End Sub 

Private Sub recordNotFound() 

    GroupBoxInputError.Text = "" 
    LabelError.BackColor = Color.Red 
    LabelError.ForeColor = Color.White 
    LabelError.Text = "NO RECORD FOUND!" 
    GroupBoxInputError.Visible = True 


End Sub 

'Public Sub encryptCard() 
' Try 
'  DES.Key = Hash.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(My.Settings.Key)) 
'  DES.Mode = System.Security.Cryptography.CipherMode.ECB 
'  Dim DESEncrypter As System.Security.Cryptography.ICryptoTransform = DES.CreateEncryptor 
'  Dim Buffer As Byte() = System.Text.ASCIIEncoding.ASCII.GetBytes(TextBoxCard.Text) 
'  TextBoxCard.Text = Convert.ToBase64String(DESEncrypter.TransformFinalBlock(Buffer, 0, Buffer.Length)) 
' Catch ex As Exception 
'  MessageBox.Show("The following error(s) have occurred: " & ex.Message, Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Error) 
' End Try 
'End Sub 

#End Region 

#Region "TOOLSTRIP MENU CONTROL CODE" 

Private Sub ExitAltF4ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitAltF4ToolStripMenuItem.Click 
    End 
End Sub 

#End Region 

#Region "BUTTON CONTROLS CODE" 

Private Sub ButtonExit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonExit.Click 
    FormMain.Show() 
    Me.Close() 
End Sub 

Private Sub ButtonReset_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonReset.Click 
    Call ResetForm() 
End Sub 

Private Sub ButtonSubmit_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSubmit.Click 
    Call SetDBData() 
    Call ResetForm() 
End Sub 

Private Sub ButtonEncrypt_Click(sender As System.Object, e As System.EventArgs) Handles ButtonEncrypt.Click 

End Sub 

#End Region 

#Region "FORM CONTROLS CODE" 

Private Sub FormAdd_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

    Control.CheckForIllegalCrossThreadCalls = False 
    TextBoxAccount.Focus() 
    Me.KeyPreview = True 


    Timer1.Enabled = True 
    Timer1.Interval = 1 

    GroupBoxInputError.Hide() 
    ButtonSubmit.Hide() 
    ButtonReset.Hide() 
    GroupBox1.Height = 75 

    'LabelFooter.Text = "Welcome " & FormLogin.TextBoxUsername.Text() & " | Timestamp: " & Date.Now.ToString 
    Try 
     LabelIP.Text = "IP: " & Dns.GetHostEntry(Dns.GetHostName).AddressList(0).ToString 
    Catch ex As Exception 

    End Try 

    'Populate the Card Type combobox with the list of card types from the CardFormatter class 
    ComboBoxCardType.Items.AddRange(CF.GetCardNames.ToArray) 

End Sub 


#End Region 

#Region "TEXTBOX CONTROLS CODE" 

Private Sub TextBoxCard_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBoxCard.GotFocus 

    TextBoxCard.SelectionStart = 0 
    TextBoxCard.SelectionLength = Len(TextBoxCard.Text) 
    Me.Refresh() 

End Sub 


Private Sub TextBoxCard_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBoxCard.LostFocus 

    '//CARD VALIDATION// 
    ' This code will check whether the card is a valid number or not. It doesn't check to see if the card is active. 
    ' The code calls on the creditcard function stored in MyModules.vb 
    Try 
     If creditcard(TextBoxCard.Text) Then 
      'MsgBox("Card is Valid") 
      TextBoxCard.BackColor = Color.GreenYellow 
      TextBoxCard.ForeColor = Color.Black 
      GroupBoxInputError.Visible = False 
      TextBoxCard.Text = CF.GetFormattedString(ComboBoxCardType.Text, TextBoxCard.Text) 
      Me.Refresh() 
     Else 
      BWErrorNotice.RunWorkerAsync() 
      'MsgBox("Invalid Card") 
      GroupBoxInputError.Visible = True 
      TextBoxCard.Focus() 
      TextBoxCard.Text = TextBoxCard.Text.Replace("-", "") 
      Me.Refresh() 
     End If 
    Catch ex As Exception 

    End Try 

End Sub 

Private Sub TextBoxAccount_GotFocus(sender As Object, e As System.EventArgs) Handles TextBoxAccount.GotFocus 
    TextBoxAccount.SelectAll() 
End Sub 

Private Sub TextBoxAccount_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBoxAccount.KeyDown 

    If e.KeyCode = Keys.Enter Then 
     e.SuppressKeyPress = True 
     If TextBoxAccount.Text <> "" Then 
      Call GetDBdata() 
     Else 
      MsgBox("You must enter an account number!", MsgBoxStyle.Exclamation, "ATTENTION PLEASE!") 
      TextBoxAccount.Focus() 
     End If 
    End If 

    'If e.KeyCode = Keys.Enter Then 
    ' e.Handled = True 
    ' SendKeys.Send("{Tab}") 
    'End If 

End Sub 

Private Sub TextBoxCard_MouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles TextBoxCard.MouseClick 
    TextBoxCard.SelectionStart = 0 
    TextBoxCard.SelectionLength = Len(TextBoxCard.Text) 
    TextBoxCard.Text = TextBoxCard.Text.Replace("-", "") 
    Me.Refresh() 
End Sub 

#End Region 

#Region "OTHER/MISCELLANEOUS CONTROLS CODE" 

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick 
    LabelDateTime.Text = DateTime.Now 

End Sub 

Private Sub BWErrorNotice_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BWErrorNotice.DoWork 

    Do While Not creditcard(TextBoxCard.Text) 
     LabelError.BackColor = Color.Black 
     System.Threading.Thread.Sleep(500) 
     LabelError.BackColor = Color.Red 
     System.Threading.Thread.Sleep(500) 
    Loop 
    BWErrorNotice.CancelAsync() 

End Sub 

Private Sub CheckBoxConfirm_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles CheckBoxConfirm.CheckedChanged 
    If CheckBoxConfirm.Checked = True Then 
     ButtonSubmit.Show() 
    Else 
     ButtonSubmit.Hide() 
    End If 
End Sub 

#End Region 

End Class 
+1

У вас есть кнопка в форме с набором свойств «По умолчанию» или с помощью DialogResult = Ok? –

+0

Нет, у меня есть четыре кнопки, и у всех их есть DialogResult = None. Что такое свойство Default и как его найти? –

ответ

0

Я понял, проблема. Я вызывал Dispose() в конце моей функции GetDBData(), поэтому форма была удалена до того, как выполнение вернулось обратно в TextBox. Я удалил его, и все снова хорошо.

1

Хотя то, что следует не вероятно решить проблему формы исчезновения, он будет решать нижестоящий вопрос:

В GetDBData(), вы присваивая accountNumber значение TextBoxAcount.Text, которое должно быть заключено в кавычки, если вы не используете параметр, который я настоятельно рекомендую вам привыкнуть.

Dim dbAdapter As New MySqlDataAdapter("SELECT * FROM customer WHERE accountNumber = " & TextBoxAccount.Text, dbConn) 

Параметры предлагают ряд преимуществ, в том числе неявного типа, предотвращения атак инъекции, и иногда даже вылечить неожиданное поведение.

+0

Спасибо Рон. Я все еще изучаю, как использовать параметры. На данный момент это смущает меня, поэтому я хочу, чтобы первая работала, а затем я буду использовать код для использования параметров. У меня есть пример, из которого я могу работать. Спасибо за вашу заботу. –

+0

Добро пожаловать, и я рад помочь. Сначала я попробую включить текст с одинарными кавычками, что вполне может решить проблему исчезающих форм. –

Смежные вопросы