Как получить SelectedIndex из другой формы vb.net - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь добавить и сотрудника, и свою работу одновременно. У меня есть таблица идентификаторов, в которую я пытаюсь вставить обе записи. У меня есть кнопка НАЙТИ, которая открывает поле со списком в другой форме, заполненной заданиями. Как только выбор сделан, он заполняет текстовое поле txtJobName в первой форме. Это заполняется именем задания, как и должно, но я не могу вытащить SelectedIndex для вставки в таблицу TJobEmployees.

'Variables
Dim strSelect As String
Dim strInsert As String
Dim strFirstName As String = ""
Dim strLastName As String = ""
Dim strJob As String = frmSelectJobName.strSelectedJob
Dim intJobID As Integer
Dim cmdSelect As OleDb.OleDbCommand
Dim cmdInsert As OleDb.OleDbCommand
Dim dr As OleDb.OleDbDataReader
Dim intNextHighestRecordID As Integer
Dim intRowsAffected As Integer
Dim result As DialogResult


strFirstName = txtFirstName.Text
strLastName = txtLastName.Text
strJob = txtJobName.Text
intJobID = CInt(frmSelectJobName.lstJobs.SelectedValue)

If Validation() = True Then

  If OpenDatabaseConnectionSQLServer() = False Then

    ' No, warn the user ...
    MessageBox.Show(Me, "Database connection error." & vbNewLine &
                                "The application will now close.",
                                Me.Text + " Error",
                                MessageBoxButtons.OK, MessageBoxIcon.Error)

    ' and close the form/application
    Me.Close()

  End If

  ' always ask before adding!!!!
  result = MessageBox.Show("Are you sure you want to Add Employee: Job-" & txtJobName.Text & "?", "Confirm Submission", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question)

  ' this will figure out which button was selected. Cancel and No does nothing, Yes will allow insert
  Select Case result
    Case DialogResult.Cancel
      MessageBox.Show("Action Canceled")
    Case DialogResult.No
      MessageBox.Show("Action Canceled")
    Case DialogResult.Yes

      strSelect = "SELECT MAX(intEmployeeID) + 1 AS intNextHighestRecordID " &
                    " FROM TEmployees"

      ' Execute command
      cmdSelect = New OleDb.OleDbCommand(strSelect, m_conAdministrator)
      dr = cmdSelect.ExecuteReader

      ' Read result( highest ID )
      dr.Read()

      ' Null? (empty table)
      If dr.IsDBNull(0) = True Then

        ' Yes, start numbering at 1
        intNextHighestRecordID = 1

      Else

        ' No, get the next highest ID
        intNextHighestRecordID = CInt(dr.Item(0))

      End If
      ' add the child record
      strInsert = "Insert into TEmployees (intEmployeeID, strFirstName, strLastName)" &
        " Values (" & intNextHighestRecordID & ",'" & strFirstName & "'," & "'" & strLastName & "')"

      cmdInsert = New OleDb.OleDbCommand(strInsert, m_conAdministrator)
      intRowsAffected = cmdInsert.ExecuteNonQuery()
      'add the parent record
      strInsert = "Insert into TJobEmployees (intJobID, intEmployeeID)" &
                " Values (" & intJobID & ",'" & intNextHighestRecordID & "')"

      ' Insert the record(s) 
      cmdInsert = New OleDb.OleDbCommand(strInsert, m_conAdministrator)
      intRowsAffected = cmdInsert.ExecuteNonQuery()

      If intRowsAffected > 0 Then
        MessageBox.Show("Job has been added")
        Me.Close()
      End If

  End Select

  CloseDatabaseConnection()

  Form1_Load(sender, e)

End If

1 Ответ

0 голосов
/ 11 февраля 2020

Существует много рефакторинга, который вы должны сделать с этим кодом. Начните с этого, и он поможет вам добраться туда, куда вы хотите go:

  • Удалите устаревшую венгерскую нотацию.
  • У вашей формы выбора работы есть два свойства: SelectedJobName и SelectedJobID
  • Дайте форме выбора работы более значимое имя, потому что оно не возвращает только имя работы. например, JobPickerForm.
  • Создание экземпляра формы выбора работы: Using f As New frmSelectJobName
  • Получение выбранных значений из свойств: например, selectedJobID = f.SelectedJobID
  • Задать вопрос пользователю если они действительно хотят добавить сотрудника до проверки и проверки соединения.
  • Вы используете SQL Сервер. Используйте объекты в пространстве имен SqlClient вместо OleDb.
  • Объявите свое поле идентификатора сотрудника в базе данных как поле IDENTITY, чтобы вам не приходилось использовать хакерский MAX(ID) + 1.
  • Используйте хранимые процедуры для ваших запросов. Текущий метод открыт для SQL инъекций. Хотя вы все еще можете использовать встроенный SQL, я считаю, что SP предпочтительнее для себя.
  • Верните SCOPE_IDENTITY сотрудника, добавленного в таблицу сотрудников. Это дает вам значение первичного ключа добавленного сотрудника.
  • Создание всех объектов SqlClient с помощью конструкции Using. Объявите и откройте свое SqlConnection локально для Sub / Function, а не где-то еще.
  • Что бы ни было в Form_Load (), поместите его в отдельную Sub и вызовите эту sub. Вы передаете sender, и из вашего фрагмента кода я понятия не имею, в каком событии находится этот код.

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

Вот пример измененных свойств JobPickerForm.

Public Class JobPickerForm

    Public ReadOnly Property SelectedJobID As Integer = 0
    Public ReadOnly Property SelectedJobName As String = String.Empty


    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.

        ' Whatever code you have that loads the JobsListBox.....

    End Sub

    Private Sub SelectButtonClickEvent(sender As Object, e As EventArgs) Handles SelectButton.Click

        _SelectedJobID = CInt(JobsListBox.ValueMember)
        _SelectedJobName = JobsListBox.DisplayMember.ToString

    End Sub

End Class

Вот пример использования нового JobPickerForm:

Dim selectedJobName As String = String.Empty
Dim selectedJobID As Integer = 0

Using f As New JobPickerForm

    f.ShowDialog()

    selectedJobID = f.SelectedJobID
    selectedJobName = f.SelectedJobName

End Using
...