C# 从另一个类打开泛型表单会导致IWIN32窗口转换错误

C# 从另一个类打开泛型表单会导致IWIN32窗口转换错误,c#,vb.net,winforms,generics,C#,Vb.net,Winforms,Generics,我一直在使用下面的代码,通过单击datagrid单元格中的按钮打开一个通用表单。这已经运行了好几个月了,但是我需要在另外两个表单中实现相同的代码,所以为了保存重复的代码,我决定创建一个包装类来处理这个问题,并在需要的地方创建这个类的实例。但是,我得到一个“从类型'ComplexPropertiesFormWrapper'到类型'IWin32Window'的转换无效”。错误,考虑到它在我的第一个实现版本中起作用,我根本不理解 第一次实施(按预期工作): 第二个实现(如上所述获取错误): 下面是上面

我一直在使用下面的代码,通过单击datagrid单元格中的按钮打开一个通用表单。这已经运行了好几个月了,但是我需要在另外两个表单中实现相同的代码,所以为了保存重复的代码,我决定创建一个包装类来处理这个问题,并在需要的地方创建这个类的实例。但是,我得到一个“从类型
'ComplexPropertiesFormWrapper'到类型'IWin32Window'的转换无效”。
错误,考虑到它在我的第一个实现版本中起作用,我根本不理解

第一次实施(按预期工作):

第二个实现(如上所述获取错误):

下面是上面修改的事件处理程序:

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#中很受欢迎。

类似“FormWrapper”的名称可能会暗示问题的根源,但听起来不像是从Form派生的类。它是实现IWin32Window接口的Form类。您的类也必须实现这一点才能使转换有效。如果没有其他困难,只需返回包装表单的Handle属性即可。不要考虑将表单派生类打包成另一种解决方案,通常很少需要这样做。

远程次要解释是,您重新声明了IWin32Window,不要这样做。

Form.ShowDialog()方法重载,不接受任何参数或IWin32Window。您正在调用后一个实现

ComplexPropertiesFormWrapper类是否继承表单?如果不是,则不能将其浇注到iwin32窗口

您可以更改它,使其继承自表单,或者在不使用Me参数的情况下调用ShowDialog()?如果是前者,则需要将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

ComplexPropertiesFormWrapper
inherit
Form
?非常感谢,这很简单,因为没有从
Form
继承,我相信我没有错过!
Public Class ComplexPropertiesFormWrapper

    Public Sub Show()

        Dim f As New Form1

        f.ShowDialog()

    End Sub
End Class