2011-12-16 4 views
2

ここで私はwinformのすべてのコントロールをループし、サブクラス化されたコントロールを見つけることができましたが、ユーザー定義のプロパティ_keyと_valueオブジェクトCTRLは、それらを公開していません:(私は ctrlContainerを使用してい を以下このwinformsコントロールでサブクラス化された新しいプロパティを見つけることができません

foreach (Control ctrl in ctrlContainer.Controls) 
{ 
    // code to find my specific sub classed textBox 
    // found my control 
    // now update my new property _key 
    ctrl._key does not exist :(

    I know the ctrl exists and is valid because ctrl.Text = "I've just added this text" works. 
    _key is visible when looking at the control in the form designer. 
} 

私が間違ってやっている誰もが私にについてのヒントを与えることはできますか? 感謝として渡された呼び出し元のフォームです。

答えて

3

参照がタイプであるためです0(foreach (Control ctrl)、私はあなたのサブクラス化されたコントロールではないと推測しています。その参照は、それに属するメンバーだけを理解するでしょう。_keyはおそらく派生クラスに属しています。これを試してください:

foreach (Control ctrl in ctrlContainer.Controls) 
{ 
    // code to find my specific sub classed textBox 
    // found my control 
    // now update my new property _key 
    if (ctrl is MyControl) 
    { 
     MyControl myControl = (MyControl)ctrl; 
     myControl._key = ""; 
    } 
} 

また、セバスチャンの提案するように、コントロールのインスタンスだけを見つけるようにイテレータを変更することもできます。これはよりクリーンなコードになります。

+0

をforeachの(ctrlContainer.Controls.OfType中のvar CTRLは())コントロールなど、グループボックス内の任意のテキストボックスを探したコードを台無しので、これも私のために働い:

はやってみてください。 – Hunt

4

_keyは、Controlを検索しているために存在しません。

foreach (var ctrl in ctrlContainer.Controls.OfType<MyControl>()) 
{ 
    ctrl._key = "somthing"; 
} 
+0

あなたは現在のコントロールタイプのコントロール用のコンテナを反復するだけです。これは '_key'プロパティを持つことが保証されています。それをあなたが質問に投稿したやり方で行うことで、すべてのコントロールがそのタイプのものであることを保証することはできません(実際にはそれらはありません)。 –

+0

結果の繰り返しは同じで、すべての型がチェックされます。しかし、linqのバラエティはイテレータ自体にチェックを埋め込みますが、それ以外の場合は自分の答えに従って手動でチェックする必要があります。つまり、Linqのアプローチ+1が好きです。 –

+0

@AdamHouldsworthの場合には、私の答えはあなたのものではなく今削除されたコメントのためであった(私はあなたが言っていると思う!)。 –

関連する問題