从另一个类打开泛型表单会导致IWin32Window转换错误
本文关键字:IWin32Window 转换 错误 表单 另一个 泛型 | 更新日期: 2023-09-27 18:17:56
我一直在使用以下代码,将从数据网格单元格内的按钮单击打开一个通用表单。这已经工作了好几个月了,但是我需要在另一对表单中实现相同的代码,所以为了节省重复的代码,我决定制作一个包装器类来处理这个问题,并在需要的地方创建这个类的实例。然而,我得到一个"转换从类型'ComplexPropertiesFormWrapper' to type 'IWin32Window' is not valid.'
错误,我根本不明白考虑到它在我的第一个版本的实现工作。
第一个实现(按预期工作):
Private Sub editorButton_Click(sender As Object, e As EditorButtonEventArgs)
Dim dataObject As New DataObject()
Dim dataObjectType As Type = dataObject.Type
Dim formType As Type = GetType(ManageComplexProperties(Of )).MakeGenericType(dataObjectType)
Dim complexPropertiesForm = Activator.CreateInstance(formType, _
New Object() {dataObject.Value, dataObject.ValueIsList, Nothing, MyBase.UnitOfWorkNH})
If complexPropertiesForm.ShowDialog(Me) = DialogResult.OK Then
dataObject.Value = complexPropertiesForm.GetResult()
End If
complexPropertiesForm.Dispose()
End Sub
第二个实现(得到如上所述的错误):
下面是上面修改过的事件处理程序:
Private Sub editorButton_Click(sender As Object, e As EditorButtonEventArgs)
Dim dataObject As New DataObject()
Dim dataObjectType As Type = dataObject.Type
Dim complexPropertiesFormWrapper As New ComplexPropertiesFormWrapper(dataObjectType, dataObject.Value, dataObject.ValueIsList, Nothing, MyBase.UnitOfWorkNH)
complexPropertiesFormWrapper.Show()
dataObject.Value = complexPropertiesFormWrapper.Value
complexPropertiesFormWrapper.Dispose()
End Sub
下面是ComplexPropertiesFormWrapper类中的相关方法:
Public Sub Show()
Dim formType As Type = GetType(ManageComplexProperties(Of )).MakeGenericType(_type)
Dim _manageComplexPropertiesForm = Activator.CreateInstance(formType, _
New Object() {_value, _valueIsList, Nothing, _unitOfWork})
'ERROR OCCURS ON THE FOLLOWING LINE
_result = _manageComplexPropertiesForm.ShowDialog(Me)
If _result = DialogResult.OK Then
_resultValue = _manageComplexPropertiesForm.GetResult()
End If
End Sub
Public Sub Dispose()
_manageComplexPropertiesForm.Dispose()
End Sub
有部分代码丢失了,但是它们都与表单和类的操作有关,因此不会由这个问题引起。
我花了一点时间搜索,我找不到太多的主题栏参考窗口的IntPtr
和控件的句柄,这似乎没有描述我的问题。
有没有人有解决这个问题的办法,和/或解释为什么会发生?
欢迎用VB或c#给出答案
Form.ShowDialog()方法是重载的,它要么不接受参数,要么接受IWin32Window。您正在调用后一种实现。
你的ComplexPropertiesFormWrapper类继承Form吗?你可以改变它,所以它继承自Form或调用ShowDialog()没有Me参数?如果是前者,你需要将ComplexPropertiesFormWrapper.Show()声明为重载。
第一个方法:
Public Class ComplexPropertiesFormWrapper
Inherits Form
Public Overloads Sub Show()
Dim f As New Form1
f.ShowDialog(Me)
End Sub
End Class
第二种方法:
Public Class ComplexPropertiesFormWrapper
Public Sub Show()
Dim f As New Form1
f.ShowDialog()
End Sub
End Class
像"FormWrapper"这样的名字会暗示问题的根源,它听起来不像一个派生自Form的类。窗体类实现了IWin32Window接口。您的类也必须实现这一点,以使转换有效。这并不难做到,只需要返回包装表单的Handle属性。作为另一种解决方案,请考虑根本不包装Form派生类,通常很少需要这样做。
一个远距离的二次解释是你重新声明了IWin32Window,不要那样做