从另一个类打开泛型表单会导致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#给出答案

从另一个类打开泛型表单会导致IWin32Window转换错误

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,不要那样做