2017-02-07 17 views
1

だから私はcontrol.findをしばらく使っていますが、それは魅力的です。 私が使っていることを理解したい。 C#control.findの説明

txt.Text = string.Empty;

上記

Control txt = this.Controls.Find(x + "_" + y + "_" + z, true)[0] as TextBox;

iはX、Y、Zは、タイプ int(又は時には string)のものであり、この方法を使用する方法の一つの例であり、それは実際にうまく機能します手続き的に生成されたコントロールでは、私はそれらの多くを持っているので、私のいくつかのメソッドは、特定のテキストボックスにアクセスする必要があります。

今やMSDN - Control.Findは、このメソッドに関しては、1つのことを除いて、ほとんど私の質問に私をもたらします。

[0]:このbadboyは、この方法の私の理解をより良くしようとしているところです。

私はそれがそのまま残されています。削除された場合、メソッドは爆発します。 [0]に関して、少なくとも3つのことを知りたい、それ以外に何かがボーナスになること、まずそれは何か、なぜそこにあり、この男にとって有益なシナリオはありますか?

私はこのメソッドを使用しても問題はありません。さまざまなタイプのコントロールに多くのものを使用しています。これは純粋に事実を見つける質問です。

答えて

3

ControlCollection.Findは、Control[]を返します。理由は、同じ名前のフォームに複数のコントロールを持つことができるからです。

2番目のパラメータはboolで、これはtrueに設定されています。このコントロールを再帰的に検索するか、親コントロール内でのみ検索するかを示します。

同じ名前のコントロールが2つない場合は、コードは安全です。

そうしないはず

  1. 避ける重複した名前
  2. か、それが望まれる場合には、これらのコントロールを反復処理の代わりに、あなたができることだけ最初

注意をaccesssingするためにループを使用して」重複する名前を検出するデザイナーを経由して同じ名前のコントロールを追加する。しかし、プログラムで同じ名前のコントロールを自由に追加することはできます。

+0

すべての私のコントロールを保存するためのものであるボタンのみを与えるだろう。私が理解していないことは、[0] –

+0

@ JuanPikeを効果的に使う方法です。効果的にはどういう意味ですか?インデックスを介して配列内のアイテムにアクセスするのは非常に効果的です –

+0

はい、非常に効果的ですが、もっと多くのコントロールを追加して、必要なときに配列からアクセスすることを意味します。 –

2

それは何であるあなたは、戻り値を見れば、なぜそれが

があります: Find方法の Control[]、あなたはそれがすべての可能なマッチの配列を返すことがわかります。最初の要素は [0]です。

EDIT:このバージョンは実際には保存されません。

Control[] asd = this.Controls.Find(x + "_" + y + "_" + z, true); 

if(asd.Any()) // if you have found any elements 
{ 
    TextBox t = asd.First() as TextBox; 
    t.Text = "Whatever"; 
} 

あなたはOfTypeメソッドを使用することができ、同じタイプの複数のコントロールを取得したい場合:安全なバージョンが一致するが実際に見つかったかどうかをチェックします

List<Button> asd = this.Controls.OfType<Button>().ToList(); 

これは、あなたのすべてのButtonを取得しますあなたのフォームに。

Imagingeのようなあなたは10個のボタンがあり、そのうちの4が(多分異なるフォーマットを保存するための)名前に特別な結末を持っている場合:
btn_save_xml
btn_save_dat
btn_save_txt

...あなたは似た名前を持つすべてのボタンを検索したい場合は

あなたはこれを使用することができます。

List<Button> asd = this.Controls.OfType<Button>().Where(x => x.Name.Contains("save")).ToList(); 

は今、これはあなたに彼らはすべての設定の境界とのforループで生成された、ユニークな名前を持つ

+0

は、配列に複数のコントロールをロードできるという意味ですか? –

+0

はい、 –

+0

@JuanPike私は自分の答えを編集し、複数のコントロールや不特定の名前を検索する可能性を追加しました –