Как получить SelectedIndex из другой формы vb.net

Я пытаюсь добавить и сотрудников, и их работу сразу. У меня есть таблица идентификаторов, в которую я пытаюсь вставить обе записи. У меня есть кнопка НАЙТИ, которая открывает поле со списком в другой форме, заполненной заданиями. После того, как выбор сделан, он заполняет текстовое поле 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

person Kris Scheid    schedule 10.02.2020    source источник
comment
Зачем вам SelectedIndex, если у вас уже есть jobId от intJobID = CInt(frmSelectJobName.lstJobs.SelectedValue)?   -  person Fabio    schedule 10.02.2020
comment
Мне нужно взять EmployeeID и JobID и поместить их в другую таблицу TJobEmployee. По сути, в этой таблице говорится, что вы можете нанять сотрудника на одной или нескольких должностях. Если есть другой способ добавить сотрудника на вакансии. Я собираюсь полностью переработать это.   -  person Kris Scheid    schedule 10.02.2020
comment
Какая у вас тогда проблема с SelectedIndex?   -  person Fabio    schedule 10.02.2020
comment
Возможно, вам нужно закрыть форму из формы вызывающего абонента после того, как вы выберете данные selectedindex   -  person user11982798    schedule 10.02.2020
comment
Извините, я забыл упомянуть конкретную ошибку. Я получаю сообщение об ошибке ограничения внешнего ключа на TJobEmployees_TJobs_FK в таблице TJobs в столбце intJobID   -  person Kris Scheid    schedule 10.02.2020
comment
@KrisScheid, потому что .SelectedIndex ComboBox не имеет ничего общего с идентификатором кода задания в базе данных.   -  person HardCode    schedule 10.02.2020
comment
@KrisScheid, какую базу данных вы используете?   -  person HardCode    schedule 10.02.2020
comment
SQL Server Management Studio 2012   -  person Kris Scheid    schedule 10.02.2020
comment
@HardCode. Я не понимаю, потому что идентификатор находится в моем операторе SELECT, а также является ValueMember для загрузки списка. Я знаю, что все время говорю "поле со списком", имел в виду список.   -  person Kris Scheid    schedule 10.02.2020
comment
Я предполагаю, что вы используете версию SQL Server, основанную на комментарии Management Studio. Я рекомендую вам создать поле IDENTITY в ваших таблицах. Это устраняет не очень надежный MAX(intEmployeeID) + 1. Есть много других рекомендаций, таких как создание экземпляров ваших объектов OleDb с помощью конструкции Using. Дайте мне посмотреть, смогу ли я сформулировать несколько предложений ...   -  person HardCode    schedule 10.02.2020


Ответы (1)


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

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