Member 13455256 Ответов: 2

Как передать переменную обратно в вызывающую форму


Заранее благодарю вас за вашу помощь.
Я открываю ESTIMATESEARCH из REPAIRS и получаю идентификатор записи из сетки ESTIMATESEARCH. Затем я сохраняю это значение в текстовом поле при ремонте и закрываю ESTIMATESEARCH
Моя проблема заключается в том, что VB-код на ESTIMATESEARCH не обрабатывается до тех пор, пока вызывающий код на ремонте не завершится, поэтому нужных мне данных там нет... пока.
Я прочитал несколько решений на этом сайте, и одно или несколько из них могут работать, но они находятся в C#, поэтому мне придется конвертировать их, чтобы узнать это. Я могу ошибаться, но думаю, что это простое решение. Я раньше программировал на VB6 лет назад и только начал с этого VB.NET месяц назад.

Что я уже пробовал:

Код формы 1
Private Sub SearchEstimatesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SearchEstimatesToolStripMenuItem.Click
    EstimateSearch.Show()
    If SearchBox.Text > "" Then
        'look for this string

    End If
End Sub


Код формы 2
Private Sub EstGrid_CellDoubleClick(sender As Object, e As DataGridViewCellEventArgs) Handles EstGrid.CellDoubleClick
     Dim MCol = e.ColumnIndex
     Dim MRow = e.RowIndex
     Dim CurrentRow As Integer
     CurrentRow = EstGrid.CurrentRow.Index
     If CurrentRow >= 0 Then
         Repairs.SearchBox.Text = EstGrid.Rows(CurrentRow).Cells(0).Value
         Me.Close()
     End If
 End Sub

2 Ответов

Рейтинг:
1

OriginalGriff

Использование метода showdialog, а не шоу:

Private Sub SearchEstimatesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SearchEstimatesToolStripMenuItem.Click
    EstimateSearch.ShowDialog()
    If SearchBox.Text > "" Then
        'look for this string

    End If
End Sub
Таким образом, ваша родительская форма "ждет" закрытия новой формы, прежде чем код продолжится.

Но... вы должны проверить, закрыл ли пользователь его положительно (с помощью кнопки OK) или отрицательно (с помощью кнопки Cancel), проверив результат диалога и "попросите форму" для этого значения:
If EstimateSearchBox.ShowDialog = DialogResult.OK Then
   string result = EstimateSearchBox.Result
   ...
End If
И укажите свойство в диалоговом окне, которое возвращает содержимое текстового поля.


Рейтинг:
1

Maciej Los

В дополнение к решению №1 по OriginalGriff[^], я бы предложил прочитать об этих методах, чтобы понять различия между ними:
Метод Form.Show(IWin32Window) (System.Окна.Формы) | Microsoft Docs[^] - показывает форму в виде немодального диалогового окна.
Метод Form.Show(IWin32Window) (System.Окна.Формы) | Microsoft Docs[^] - показывает форму в виде модального диалогового окна.

Чтобы достичь того, о чем упоминал ОГ, вы должны установить Свойство DialogResult (System.Окна.Формы) | Microsoft Docs[^] кнопок "ОК" и "отмена", расположенных на ESTIMATESEARCH форма. Для получения более подробной информации, пожалуйста, смотрите: Как использовать свойство DialogResult в Visual Basic .NET или в Visual Basic 2005[^]