3

「textBoxQH_N」という名前のTextBoxを見つけたいのですが、「_N」は1..96からの数字です。

だから、私はこのコードを持っています:

String sTextBoxToFind = String.Format("textBoxQH{0}", QuarterHour);
TextBox tb = (TextBox)this.Controls.Find(sTextBoxToFind, true);

...しかし、「タイプ'System.Windows.Forms.Control[]'を'System.Windows.Forms.TextBox'に変換できません」というメッセージが表示されました

そこで、2行目を変更して、最初に返されたvalだけを取得しました。

TextBox tb = (TextBox)this.Controls.Find(sTextBoxToFind, true)[0];

どちらが機能しているように見えますが、コントロールのNameプロパティはその所有者に固有であるべきではありませんか?IOW、Find()は0..1コントロールのみを返す必要がありますよね?

4

4 に答える 4

7

Find、2番目のプロパティがtrueに設定されている場合、再帰的です。「名前」はその親に固有ですが、さまざまな親を検索しています。「名前」はグローバルに一意ではありません。

Justinが別の回答で示唆しているように、FirstまたはアレイFirstOrDefaultで使用するよりもおそらく優れています。[0]それは将来の読者にあなたの意図を伝えるより良い仕事をします。

于 2012-04-23T17:24:40.437 に答える
3

このFindメソッドは一致するものをすべて検索するため、あなたの場合は1つだけの一致ですが、他の場合は多数になる可能性があります。Firstより意味的に意味のあるものが必要な場合は、おそらくここでLINQを使用できますか?

これに関するMSDNは、この方法についてはかなり明確です。

于 2012-04-23T17:24:32.060 に答える
1

コントロールの配列を返します。次のように試してください:

Control[] tb = this.Controls.Find("textBox1", true); //change the name of the control

また:

TextBox[] tbs = (TextBox[])this.Controls.Find("tb1", true);

ご覧のとおり、正しいタイプのオブジェクト(この場合はTextBoxの配列)にキャストする必要があります。お役に立てば幸いです、さようなら

于 2012-04-23T17:24:48.927 に答える
1

フォームAPIの設計の観点から0と1の選択肢は、nullチェックの必要性を回避するために、IEnumerable / collection/arrayとして返される方が適切です。

他の回答で指摘されているように、コントロールの名前はグローバルに一意である必要はなく、Findは実際には複数のアイテムを返す場合があります。

MSDNへのリンク-Controls.Find

于 2012-04-23T17:27:45.477 に答える