0

データベースからコンボボックスが入力された親フォームがあり、そこからユーザーが選択できます。コンボボックスの最後の値は「新規追加」です。ユーザーがこれを選択すると、ユーザーがデータベースに新しい値を追加するための子フォームが開きます。return valueこの値をデータベースに追加し、新しい値を親に送信してフォームを閉じるためのボタン押下イベントがあります。次に、親はコンボボックスから新しい値を選択し、ユーザーが別のアクションを実行するのを待つ必要があります。

ただし、return valueを親に送信してフォームを閉じるコードは正しく機能していません。私hideは子供です。次に、親と一緒に関数を呼び出して、にアクセスしreturn valueます。この時点で、子フォームとコードは、別のまたはshowsを実行する前に停止します。hideclose

どうすればこれを修正できますか(以下のコード)?

親コンボボックスイベント:

Private Sub cmbLocations_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbLocations.SelectedIndexChanged
    If Not cmbLocations.SelectedIndex = -1 Then
        If cmbLocations.SelectedIndex = cmbLocations.Items.Count - 1 Then
            If diaAddLocation.IsAccessible = False Then diaAddLocation.Activate()
            diaAddLocation.RequestSender = Me
            diaAddLocation.ShowDialog()
            FillLocations()
            cmbLocations.SelectedIndex = LocationFromLocationName(diaAddLocation.formresult)
            diaAddLocation.Close()
            diaAddLocation.Dispose()
        Else
            bttYes.Enabled = True
        End If
    End If
End Sub

子ボタンを押して戻り値機能

Public Sub bttAddLOCtoDatabase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttAddLOCtoDatabase.Click

    Dim LocationToBeAdded As String
    LocationToBeAdded = "'" & TextBox1.Text & "'"
    AddLocation("'" & textbox1.Text & "'")
    FormResult = textbox1.Text
    GetLocations()
    frmFieldMaster.InitialiseNewParameter()
    Me.Hide()
End Sub


Public Function Result() As String
    Return FormResult
End Function

編集:

Steveのソリューションが実装されたコード:

Public Sub bttAddLOCtoDatabase_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles bttAddLOCtoDatabase.Click

    Dim LocationToBeAdded As String
    LocationToBeAdded = "'" & TextBox1.Text & "'"
    AddLocation("'" & textbox1.Text & "'")
    FormResult = textbox1.Text
    GetLocations()
    frmFieldMaster.InitialiseNewParameter()
    DialogResult = Windows.Forms.DialogResult.OK
    'me.Hide()

End Sub

Public Function Result() As String
    Return FormResult
    Me.Close()
End Function

Private Sub cmbLocations_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbLocations.SelectedIndexChanged
    Dim ValueTaken As Boolean = False
    If Not cmbLocations.SelectedIndex = -1 Then
        If cmbLocations.SelectedIndex = cmbLocations.Items.Count - 1 Then
            Using diaaddlocation = New diaAddLocation
                diaaddlocation.requestsender = Me
                If DialogResult.OK = diaaddlocation.showdialog Then
                    FillLocations()
                    cmbLocations.SelectedIndex = LocationFromLocationName(diaaddlocation.result)
                    diaaddlocation.close()
                ElseIf DialogResult.Cancel = diaaddlocation.showdialog Then
                    cmbLocations.SelectedIndex = -1
                End If
            End Using
        Else
            bttYes.Enabled = True
        End If
    End If
End Sub

コードを実行するIF DialogResult.OK...と、子が入力されて開きます。次に、子を閉じると、親は次の2行のコードを実行し、子から結果を取得します。この後、親はIF DialogResult.OK...再び回線を実行し、子を開いたまま停止します。コードがdiaaddlocation.close行に到達することはありません。

4

2 に答える 2

1

これらすべてが必要なわけではありません。あなたはこのようなことを試すことができます

   If cmbLocations.SelectedIndex = cmbLocations.Items.Count - 1 Then
        Using diaAddLocation = new diaAddLocation()
             diaAddLocation.RequestSender = Me
             if DialogResult.OK = diaAddLocation.ShowDialog() then
                 FillLocations()
                 cmbLocations.SelectedIndex = LocationFromLocationName(diaAddLocation.formresult)
             End If
        End Using
   Else
       .....

これには、に設定するDialogResultプロパティとにbttAddLOCtoDatabase設定されDialogResult.OKた子フォームAcceptButtonプロパティが必要bttAddLOCtoDatabaseです。bttAddLOCtoDatabase_Clickこれで、メソッド内のHide()呼び出しを削除できます

これが機能するのは、Usingステートメントを終了しない限り、子フォームでそのプロパティ(結果)を読み取ることができるためです。

編集:主な問題とは関係ありませんが、これらの行は間違っています:

 ElseIf DialogResult.Cancel = diaaddlocation.showdialog Then
       cmbLocations.SelectedIndex = -1

あなたは一緒に行くべきです

  Using diaAddLocation = new diaAddLocation()
      diaAddLocation.RequestSender = Me
      Dim dr = diaAddLocation.ShowDialog()
      if dr = DialogResult.OK then
          ....
      else if dr = DialogResult.Cancel then
          ....
      end if
于 2012-12-20T09:45:44.933 に答える
0

何が問題なのかわかりませんが、「FormResult」の値を取得していない場合</p>

閉じるかどうかは問題ではありませんが、閉じる前に DialogResult を設定することをお勧めします。これは、ダイアログ (showdialog) として表示しているためです。

diaAddLocation が直接ウィンドウ クラスではなく、ウィンドウのインスタンスであることを確認します。フォームの名前が frmdiaAddLocation の場合は、次のように使用しないでください。

frmdiaAddLocation.showdialog

のように使う

Dim diaAddLocation AS  frmdiaAddLocation = New frmdiaAddLocation()
diaAddLocation.ShowDialog()

このように使用するだけで、結果の値が得られます

于 2012-12-20T10:49:19.300 に答える