2017-06-09 10 views
0

私はprivateの形式でカスタムコントロールを持っています。私は、フォームのこのc#どの修飾子をプライベートにするか

foreach(Form f in Application.OpenForms) 

1のようなコードを持っている他の形式では

Formthatcontaincontrolsで、

Formthatcontaincontrolsprivateあるカスタムコントロールが含まれている、私は、フォーム"f"

からそのcustomcontrolにアクセスする必要があります
+4

なぜあなたはパブリックプロパティを介してコントロールを公開しませんか? –

+0

そのカスタムコントロールがプライベートに設定されている約40のフォームがあるので、 はすべて変更できませんので、解決策が必要です。 –

+0

もちろんですが、できない場合は、これらのフォームに共通の祖先そのプロパティにアクセスするためのパブリックメソッドを作成することができます – Icepickle

答えて

2

パブリックプロパティでコントロールを公開することができます:

private List<T> FindControls<T>(Control.ControlCollection controls) where T: Control 
{ 
    List<T> list = new List<T>(); 
    foreach (Control control in controls) 
    { 
     var matched = control as T; 
     if (matched != null) 
      list.Add(matched); 
     else 
      list.AddRange(FindControls<T>(control.Controls)); 
    } 
    return list; 
} 

たとえば、あなたが持つすべてのボタンを検索することができます:あなたは、フォーム内のすべてのコントロールを探索することができ

foreach(Formthatcontaincontrols f in Application.OpenForms.OfType<Formthatcontaincontrols>()) 
{ 
    TheCustomControlYouWant ctrl = f.TheCustomControl; 
} 
+0

おかげで私はそれを試してみましょう –

0

Formthatcontaincontrols

public TheCustomControlYouWant TheCustomControl 
{ 
    get { return this.CustomControl; } 
} 

で次に、あなたは、このプロパティにアクセスすることができますこれは:

foreach (var btn in FindControls<Button>(yourForm.Controls)) 
{ 
    Trace.WriteLine(btn.Name); 
} 
1

コントロールを使用する場合は、実装の詳細を公開しないでください。

親カスタムコントロール(Formthatcontaincontrols)のコンシューマーの観点からは、実装の詳細を隠す必要があります。

あなたはFormthatcontaincontrolsの消費者にとって重要な何らかの種類のプロパティにアクセスする必要があると思います。

このプロパティを公開して、コントロール自体が関連する子を見つけ、子コントロールに定義されている内部プロパティにアクセスできるようにすることをお勧めします。

Formthatcontaincontrolsは、@Tim Schmelterが貼り付けたソリューションを使用して見つけることができます。

関連する問題