C# 从另一个类打开泛型表单会导致IWIN32窗口转换错误
我一直在使用下面的代码,通过单击datagrid单元格中的按钮打开一个通用表单。这已经运行了好几个月了,但是我需要在另外两个表单中实现相同的代码,所以为了保存重复的代码,我决定创建一个包装类来处理这个问题,并在需要的地方创建这个类的实例。但是,我得到一个“从类型C# 从另一个类打开泛型表单会导致IWIN32窗口转换错误,c#,vb.net,winforms,generics,C#,Vb.net,Winforms,Generics,我一直在使用下面的代码,通过单击datagrid单元格中的按钮打开一个通用表单。这已经运行了好几个月了,但是我需要在另外两个表单中实现相同的代码,所以为了保存重复的代码,我决定创建一个包装类来处理这个问题,并在需要的地方创建这个类的实例。但是,我得到一个“从类型'ComplexPropertiesFormWrapper'到类型'IWin32Window'的转换无效”。错误,考虑到它在我的第一个实现版本中起作用,我根本不理解 第一次实施(按预期工作): 第二个实现(如上所述获取错误): 下面是上面
'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
inheritForm
?非常感谢,这很简单,因为没有从Form
继承,我相信我没有错过!
Public Class ComplexPropertiesFormWrapper
Public Sub Show()
Dim f As New Form1
f.ShowDialog()
End Sub
End Class