如何在 Vb.Net 中使用 ShowDialog 启用父窗体



嗨,我已经将 VB6代码迁移到 VB.Net,其中 VB6 中的一个功能使用模态对话框,允许用户从父表单复制少量文本。但是在 Vb.Net ShowDialog不允许用户复制任何内容,因为你们知道它只是禁用父表单。

我的问题是,有没有办法启用父表单或最小化子表单以从父表单复制少量文本?

请不要建议使用 show 而不是 ShowDialog,因为我只想使用 ShowDialog 来实现这一点。

此 VB6 代码。

Form.Show vbModal, objParent

迁移向导具有以下代码

Form.ShowDialog

答案可能是设计之一,而不是技术解决方法。ShowDialog((。让我们以您的父窗体为例,其中包含可以复制的文本以粘贴到弹出模式窗体中。我不知道您的父表单中的数据,因此我们将其称为小部件。

Public Class Widget
Public Property ID As Integer = 0
Public Property TextThatMayBeCopied As String = String.Emtpy
End Class

在父窗体的代码中,您将此数据从数据库、文件等加载到 Widget 对象中。

Private _widget As Widget = Nothing
Public Sub New()
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
' Assume we want the Widget with ID of 123
_widget = MyFunction.WhichLoadsWidgetDataAndReturnsWidgetObject(123)
DisplayData()
End Sub
Private Sub DisplayData()
txtID.Text = _widget.ID
txtTextThatMayBeCopied.Text = _widget.TextThatMayBeCopied
End Sub
Private Sub btnShowDialog_Click(sender As Object, e As EventArgs) Handles btnShowDialog.Click
_widget.TextThatMayBeCopied = txtTextThatMayBeCopied.Text.Trim
Dim f As New MyShowDialogForm(_widget)
f.ShowDialog
End Sub

您的目标表单MyShowDialogForm将在它自己的构造函数中采用Widget类型的对象:

Private _widget As Widget = Nothing
Public Sub New(widget As Widget)
' This call is required by the Windows Form Designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
_widget = widget
End Sub

您现在可以通过_widget对象访问传递给 MyShowDialogForm 的数据,例如,在 btnCopyText 的按钮单击事件中,或者根据需要访问

。这里的关键要点是使用一种以不同形式交换数据的方法。通常,使用 Form 类本身作为数据的封装会变得非常混乱。相反,请使用类来封装数据并在应用中移动数据。

'例如,我们有 2 个表单,form1(main(和form2(子(

'This Form as Main
Public Class Form1
Private Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button2.Click
'if you don't have timer in child form, you must click again this button
'after you form back awhile to this form as main form
Form2.ShowDialog()
End Sub
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Me.Close()
Me.Dispose()
End Sub
End Class
'This Form as Child
Public Class Form2
Private Sub btnToMainAWhile_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnToMainAWhile.Click
'you hide this current form to caller form, you must back here again, 
'if not this form always active in background
'or if you have timer1 here with enabled property =false here, you can add this:
'Timer1.Interval = 10000
'Timer1.Enabled = True
Me.Hide()
End Sub
Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
Me.Close()
Me.Dispose()
End Sub
'if you have timer1 and you will wait for many seconds back to main form, add this:
'Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
'    Timer1.Enabled = False
'    Me.ShowDialog()
'End Sub
End Class

最新更新