首页 > 解决方案 > 按钮处理程序在自定义 MessageBox 类中不起作用

问题描述

我正在为类似于消息框调用的程序制作自定义登录表单,返回 DialogResult 以显示登录是否成功。共有三个按钮,每个按钮返回一个不同的 DialogResult。(实际检查登录数据的代码尚未实现。)但是,只有取消按钮实际触发了相应的事件,其他按钮什么也不做。

Public Class LoginBox
    Inherits Form
    Private WithEvents btnLogin As New Button With {.Text = "Login", .Size = New Size(80, 25), .Location = New Point(230, 90), .BackColor = Color.Silver}
    Private WithEvents btnCancel As New Button With {.Text = "Cancel", .Size = New Size(80, 25), .Location = New Point(230, 120), .BackColor = Color.Silver}
    Private WithEvents btnReadOnly As New Button With {.Text = "Open in" & vbCrLf & "readonly" & vbCrLf & "mode", .Size = New Size(80, 55), .Location = New Point(130, 90), .BackColor = Color.Silver}
    Private WithEvents tbNaam As New TextBox With {.Size = New Size(180, 20), .BackColor = Color.Silver, .Location = New Point(130, 20)}
    Private WithEvents tbWachtwoord As New TextBox With {.Size = New Size(180, 20), .BackColor = Color.Silver, .Location = New Point(130, 55)}
    Private lblNaam As New Label With {.Text = "Inlognaam:", .ForeColor = Color.Silver, .Location = New Point(65, 23)}
    Private lblWachtwoord As New Label With {.Text = "Wachtwoord:", .ForeColor = Color.Silver, .Location = New Point(53, 58)}
    Private Shared WaitForButton As New System.Threading.EventWaitHandle(False, Threading.EventResetMode.ManualReset)
    Private Shared antwoord As DialogResult

    Private Sub New()
        Me.FormBorderStyle = FormBorderStyle.FixedDialog
        ControlBox = False
        Text = "Inlog IC agenda"
        AcceptButton = btnLogin
        CancelButton = btnCancel
        Size = New Size(350, 205)
        BackColor = Color.DimGray
        Controls.Add(btnLogin)
        Controls.Add(btnCancel)
        Controls.Add(btnReadOnly)
        Controls.Add(tbNaam)
        Controls.Add(tbWachtwoord)
        Controls.Add(lblNaam)
        Controls.Add(lblWachtwoord)
    End Sub

    Public Overloads Shared Function Show(ByVal ShowReadOnlyButton As Boolean) As DialogResult
        Dim X As New LoginBox
        If Not ShowReadOnlyButton Then
            X.btnReadOnly.Visible = False
            X.Size = New Size(350, 180)
            X.btnCancel.Location = New Point(130, 90)
        End If
        X.CenterToParent()
        X.ShowDialog()
        WaitForButton.WaitOne()
        Return antwoord
    End Function

    Private Sub btnLogin_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnLogin.Click
        'TODO: check login data, if incorrect, show error message

        antwoord = DialogResult.OK
        WaitForButton.Set()
    End Sub

    Private Sub btnCancel_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnCancel.Click
        antwoord = DialogResult.Cancel
        WaitForButton.Set()
    End Sub

    Private Sub btnReadOnly_Click(ByVal sender As Object, ByVal e As EventArgs) Handles btnReadOnly.Click
        antwoord = DialogResult.Ignore
        WaitForButton.Set()
    End Sub
End Class

测试显示取消按钮按预期工作。其他两个按钮未能引发适当的事件,即使(在我看来)它们的编码方式完全相同。

标签: vb.net

解决方案


按钮处理程序正在工作,但表单未关闭。原因是您错过了事件处理程序中的一行。

DialogResult = antwoord

因此,您的事件处理程序应该类似于下面的代码所示。

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
    'TODO: check login data, if incorrect, show error message

    antwoord = DialogResult.OK
    DialogResult = antwoord
    WaitForButton.Set()
End Sub

Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
    antwoord = DialogResult.Cancel
    DialogResult = antwoord
    WaitForButton.Set()
End Sub

Private Sub btnReadOnly_Click(sender As Object, e As EventArgs) Handles btnReadOnly.Click
    antwoord = DialogResult.Ignore
    DialogResult = antwoord
    WaitForButton.Set()
End Sub

“取消”被视为 DialogResult.None,因此您的印象是“取消”只能正常工作。


推荐阅读