在我的解决方案中,我有一个实现IExtenderProvider
的自定义组件,以便为其他控件提供属性。我想为该组件实现一个方法,它以控件作为参数,返回与之关联的扩展组件的实例,如下所示:
Public Function GetErrorProvider(c As Control) As MyErrorProvider
Dim errorProvider as MyErrorProvider
'Some code here
Return errorProvider
End Function
我只想查看表单并循环访问MyErrorProvider
类型的控件并使用它,因为我不会在每个表单中包含多个此组件,但我想要更多直接的方法。我想要一些逻辑,这取决于该实例的运行时定义值,超出了表单的范围。
任何想法/建议? 感谢
答案 0 :(得分:1)
为了完整性,我正在添加从上面链接的C#代码转换而来的解决方案并略微调整。看来这只能通过反思完成(如果我错了,请纠正我!):
Public Shared Function GetErrorProvider(control As Control) As MyErrorProvider
'get the containing form of the control
Dim form = control.GetContainerControl()
'use reflection to get to "components" field
Dim componentField = form.[GetType]().GetField("components", BindingFlags.NonPublic Or BindingFlags.Instance)
If componentField IsNot Nothing Then
'get the component collection from field
Dim components = componentField.GetValue(form)
'locate the ErrorProvider within the collection
Return TryCast(components, IContainer).Components.OfType(Of MyErrorProvider)().FirstOrDefault()
Else
Return Nothing
End If
End Function