vb.net - 按钮处理程序在自定义 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
测试显示取消按钮按预期工作。其他两个按钮未能引发适当的事件,即使(在我看来)它们的编码方式完全相同。
解决方案
按钮处理程序正在工作,但表单未关闭。原因是您错过了事件处理程序中的一行。
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,因此您的印象是“取消”只能正常工作。
推荐阅读
- jquery - 当我在 jquery 中调用 ID 时表单不提交,但是当我将 id 更改为类时表单提交
- asp.net-core-webapi - 如何删除 WebAPI 核心中的 WebDAV 模块?
- html - 允许在 Electron 中使用需要外部文件的 HTML 文件
- angular - 对 *ngFor 使用带有三元运算符的自定义管道
- node.js - 将 LoopBack4 连接到 REST API 和 Swagger
- typescript - 如何在graphql和sequelize中过滤三向多对多关系?
- javascript - 在 ngOnInit 和 ngOnDestroy 组件时添加和移除 css 样式
- python - 用于写入 excel 的 Pandas 分组列
- json - 如何在 React Native 中使用 json 文件获取
- javascript - 如何将 reverseString 函数转换为 sum 之类的变量。有区别吗?