我有一个自定义表单,它以form.ShowDialog()的形式打开
此表单充当确认表单。它询问您是否要接受或拒绝以前在ComboBox&文本框。
如果单击"确定",则输入将保存到Excel文件中。
如果单击"取消",则不会保存输入。
我遇到的问题是:
单击"取消"时。窗体.ShowDialog()已关闭。(这很好。)
但是当窗体.ShowDialog()再次打开时。它将焦点保留在"取消"按钮上。因此,如果您尝试用"Enter"键确认输入,您将取消它。
我的问题是,为什么Form.ShowDialog()在关闭后仍将焦点放在按钮上?
Form.ShowDialog()具有接受按钮"OK"[tabindex=1]和取消按钮"cancel"[tabindex=2],它们被设置为Enter键和Esc键。
(再次注意)关闭表单后,按钮的焦点保持不变。
使用对话框的代码部分:
ElseIf ComboBoxBP.SelectedItem = ComboBoxBP.SelectedItem And TextBoxBP.Text = TextBoxBP.Text Then
form.Label1.Text = ComboBoxBP.SelectedItem
form.Label2.Text = TextBoxBP.Text
form.ShowDialog()
If form.DialogResult = Windows.Forms.DialogResult.Yes Then
SiE()
ElseIf form.DialogResult = Windows.Forms.DialogResult.No Then
LabelBPBot.Text = "Canceled."
End If
End If
当您使用.ShowDialog()
关闭表单时,它不会像普通表单那样处理它。这是因为一旦对话框"关闭",它实际上只是隐藏起来,这样我们就可以在它真正消失之前从中获取信息。
第二个问题是表单是类(在每个表单的顶部都这样说:)
Public Class Form1
...
因此,应该创建它们的实例。VB允许Form1.Show
或Form1.ShowDialog()
使用"默认实例",但它确实使用了,这是一种耻辱。
结合这两个花絮,您会发现上次显示的表单仍在附近,与上次使用时处于相同的状态,包括上次聚焦的控件。您只是第一次使用表单的"新副本",之后,您只是重复使用旧实例。补救措施:
Using Dlg As New Form1 ' form1 is the class, dlg is the instance
... do stuff
Dim res As DialogResult = Dlg.ShowDialog()
If res = Windows.Forms.DialogResult.OK Then
'... do stuff
End If
End Using ' dispose of Dlg
最终,您将使用其他表单的默认实例(LForm.Show
)遇到类似的问题。只对默认表单实例说不。