1

我一直在使用以下代码,该代码将通过单击数据网格单元格中的按钮打开通用表单。这几个月来一直运行良好,但是我需要以另外几种形式实现相同的代码,所以为了节省重复代码,我决定创建一个包装类来处理这个问题,并在需要的地方创建这个类的一个实例。但是,我得到一个“从类型'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# 中回答。

4

2 回答 2

1

像“FormWrapper”这样的名称会暗示问题的根源,它听起来不像是派生自 Form 的类。它是实现 IWin32Window 接口的 Form 类。您的班级也必须实现这一点才能使转换有效。不难做到,只需返回包装表单的 Handle 属性。请考虑完全不将 Form 派生类包装为另一种解决方案,通常很少需要这样做。

一个远距离的次要解释是你重新声明了IWin32Window,不要那样做。

于 2013-06-10T15:44:50.397 回答
1

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

您的 ComplexPropertiesFormWrapper 类是否继承Form?如果不是,它不能转换为 IWin32Window。

您可以更改它以使其继承自Form或在没有 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
于 2013-06-10T15:48:52.167 回答