2017-07-10 58 views
1

私のソリューションでは、他のコントロールにプロパティを提供するためにIExtenderProviderを実装するカスタムコンポーネントがあります。私は、引数としてコントロールを取って、そのコンポーネントのメソッドを実装したいと思い、それが関連しているエクステンダーコンポーネントのインスタンスを返します、このような何か:拡張コントロールから拡張型インスタンスを返すメソッド

Public Function GetErrorProvider(c As Control) As MyErrorProvider 
     Dim errorProvider as MyErrorProvider 
     'Some code here 
     Return errorProvider 
    End Function 

私は単純にフォームを見て考えますMyErrorProviderタイプの制御のためにループして、それを使用してください。フォームごとに複数のコンポーネントがあるわけではありませんが、もっと直接的なアプローチが必要です。私は、フォームの範囲外で、そのインスタンスの実行時定義値に依存するロジックのためにこれを必要とします。

アイデア/提案はありますか? ありがとう

+0

私はあなたがしようとしていることについてさらに必要とするかもしれません。私がこれを行うと考えることができる唯一の方法は、あなたがすでに記述している方法でエラープロバイダのコンテナ(フォーム)をチェックすることです。 'FormEntryProvider.Controls.OfType(Of MyErrorProvider)() Next'の各mEP Forコントロールのハンドルを呼び出し側に戻すことができますか? –

+1

@JimmySmith問題は私が思ったよりも複雑です。 **コンポーネント**を返さないため、ソリューションが機能しません。どうやら、フォームからコンポーネントを取得する唯一の方法は、反射を使用することであり、実際には直感的ではありません。 – Renato

+0

Derp、これはコントロールとして見ていたので意味があります。これは毛むくじゃらに見えるかもしれませんが、あなたは[それを使うことができます](http://www.vbforums.com/showthread.php?621192-Get-a-list-of-Components-on-a-Form) –

答えて

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