You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB.NET实现显示另一个窗体时暂停代码,区分保存/取消操作

解决方案

要实现显示窗体时阻塞代码、根据按钮点击决定是否执行后续逻辑,核心是正确使用ShowDialog()并配合DialogResult判断用户操作,具体步骤如下:

1. 修改主窗体的代码逻辑

把原来的frm.Show()替换为frm.ShowDialog(),并根据对话框的返回值决定是否执行后续代码:

If ItemsNoLbl.Text = "0" Then
    MsgBox("There is no item to sale")
    Exit Sub
Else
    Dim frm As New EndBill_FRM
    frm.CustomerLbl.Text = "Customer Name : " + CustomerCmb.Text
    If CustomerCmb.Enabled = False Then
        frm.BalanceLbl.Text = "Balance: 0&"
        frm.LastDebtLbl.Text = "0"
        frm.BalLbl.Text = "0"
    Else
        frm.BalanceLbl.Text = "Balance:" + BalanceLbl2.Text
        frm.LastDebtLbl.Text = DebtLbl2.Text
        frm.BalLbl.Text = BalanceLbl.Text
    End If
    frm.totalLbl2.Text = TotalLbl2.Text
    frm.totalLbl.Text = TotalLbl.Text
    frm.debt = Val(DebtLbl2.Text)
    frm.totalBill = Val(TotalLbl2.Text)
    frm.balance = Val(BalanceLbl.Text)
    
    ' 替换Show()为ShowDialog(),获取对话框返回值
    Dim dialogResult As DialogResult = frm.ShowDialog()
    
    ' 仅当用户点击Save(返回OK)时才执行后续代码
    If dialogResult = DialogResult.OK Then
        ' ****** 这里开始执行后续逻辑 *****
        If CustomerCmb.Enabled = False Then
            InsertSalse()
        Else
            Dim debt As Decimal = Val(DebtLbl2.Text)
            Dim totalBill As Decimal = Val(TotalLbl2.Text)
            Dim total As Decimal = debt + totalBill
            If total < Val(BalanceLbl.Text) Then
                InsertSalse()
            Else
                MsgBox("The sale could not be completed because the invoice amount exceeded the available balance")
                Exit Sub
            End If
        End If
        MsgBox("Saved Seccessfully!")
        UpdateQuantity()
        New Sale_Form.Show()
    End If
End If

2. 配置EndBill_FRM窗体的按钮

需要给EndBill_FRM里的Save和Cancel按钮设置对应的DialogResult,让窗体关闭时返回正确的状态:

方法一:通过代码设置按钮事件

在EndBill_FRM的代码中添加按钮点击事件:

' Save按钮点击事件
Private Sub SaveBtn_Click(sender As Object, e As EventArgs) Handles SaveBtn.Click
    ' 可在此添加保存相关的前置逻辑(如验证数据)
    Me.DialogResult = DialogResult.OK
    Me.Close()
End Sub

' Cancel按钮点击事件
Private Sub CancelBtn_Click(sender As Object, e As EventArgs) Handles CancelBtn.Click
    Me.DialogResult = DialogResult.Cancel
    Me.Close()
End Sub

方法二:通过设计器直接设置属性

打开EndBill_FRM的设计视图:

  • 选中Save按钮,在属性窗口找到DialogResult,设置为OK
  • 选中Cancel按钮,在属性窗口找到DialogResult,设置为Cancel

这样点击按钮时,窗体自动关闭并返回对应的DialogResult,无需手动写Close()代码。

问题原因说明

你之前用ShowDialog()无效,是因为没有给按钮设置DialogResult,窗体关闭时默认返回DialogResult.None,主代码没有判断这个值,导致后续逻辑依然执行。现在通过明确设置DialogResult,主代码就能准确区分用户是点击了Save还是Cancel。

内容的提问来源于stack exchange,提问作者Bashar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 07:03:18