0

したがって、スクリプトによって動的に生成され、引数としてプルされるすべての文字列のラベルとテキスト ボックスを持つフォームがあります。ユーザーが各テキスト ボックスに入力してから、[OK] ボタンを選択するようにします。その後、各テキストボックスの各項目を処理したいと思います。以前は、項目が 1 つしかなかったので、テキスト ボックスの値を取得するための非常に単純なプロパティを作成しました。

Public string Text { get { return textbox1.Text; } }

動的な数のテキスト ボックスを使用して、同様にエレガントなことができることを望んでいました。

Public string [] Text { get { return **Each text box text as an array**; } }

私はしばらくそれについて考えてきましたが、これを設定するエレガントな方法が思い浮かびません。フォームにテキストボックスを追加する方法は次のとおりです...

string[] keywords = Environment.GetCommandLineArgs();
int placement = 10;
foreach (string keyword in keywords)
{
    if (keyword == keywords[0])
        continue;
    Label lbl = new Label();
    lbl.Text = keyword;
    lbl.Top = placement;
    this.Controls.Add(lbl);
    TextBox txt = new TextBox();
    txt.Top = placement;
    txt.Left = 100;
    this.Controls.Add(txt);

    placement += 20;
}

フォームを閉じるときに各テキスト ボックスのテキストをループ処理して、パブリック配列に値を入力することもできますが、もう少し洗練されたものを考え出し、力ずくで物事を行う習慣をやめたいと思います。これを達成する方法のクールなアイデアはありますか? すべてのテキスト ボックスを配列に追加してから、文字列プロパティで指定されたテキスト ボックスのテキストを何らかの方法で取得するか、代わりにテキスト ボックス配列をパブリック プロパティにすることができると考えています。このような書き方はあるのでしょうか...

Public string [] Text { get { return TextBoxArray[**value trying to be gotten**].Text; } }

または、これはプロパティには多すぎて、代わりにメソッドにする必要がありますか? 他のアイデアはありますか?私はそれが少し些細な質問であり、さまざまな方法で解決できることを理解しています.

4

3 に答える 3

3

他のオプションの方が良いかもしれませんが、おそらくこれが最も直接的で簡潔です: (LINQ を使用し、 add を使用し、using System.Linq;.NET 3.5 以降が必要です)

public string[] Text { get { return Controls.OfType<TextBox>().Select(x => x.Text).ToArray(); } }

これは AlejoBrz のソリューションと非常に似ていますが、より明確かつ簡潔にするために LINQ を使用しています。

于 2012-05-17T18:01:29.037 に答える
1

ここにアイデアがあります:

Public System.Collections.Generic.List<string> Text { 
    get {
        System.Collections.Generic.List<string> returnValue = new string[textBoxCount];
        foreach (Control ctrl in this.Controls)
            if (ctrl.GetType() == typeof(TextBox))
                returnValue.Add(((TextBox)ctrl).Text);
        return returnValue;
   }
}

確かに、それはすべてのコントロールを通過しますが、少なくとも System.Collections.Generic.List などのある種の変数でそれらをメモリに保持する必要はありません。または、それを実行して、この foreach で if を削除することもできます。

于 2012-05-17T17:56:27.457 に答える
1

技術的には、プロパティは getter/setter メソッドのシンタックス シュガーにすぎません。そのため、プロパティはメソッドが実行できることなら何でも実行できます (ただし、ほとんどの場合はすべきではありません!)。

コマンドライン引数を複製できないと仮定して、すべてのテキストボックスを Dictionary オブジェクトに追加するだけです。

基本的に起動時:

以下を作成します。

Dictionary<string, TextBox> boxes;

コマンド パラメーターをキーとして使用して、スタートアップ コードにテキスト ボックスを追加します。

boxes.Add(commandName, newTextBox);

次に、ゲッターで次を使用して辞書にアクセスできます

boxes[commandName]

操作できるテキストボックスを返します。もちろん、これはすべて強く型付けされています:)

コード例を次に示します。

string[] keywords = Environment.GetCommandLineArgs(); 
Dictionary<string, TextBox> boxes = new Dictionary<string, TextBox>();
int placement = 10; 

foreach (string keyword in keywords) 
{ 
    if (keyword == keywords[0]) 
        continue; 
    Label lbl = new Label(); 
    lbl.Text = keyword; 
    lbl.Top = placement; 
    this.Controls.Add(lbl); 
    TextBox txt = new TextBox(); 
    txt.Top = placement; 
    txt.Left = 100; 
    this.Controls.Add(txt); 
    placement += 20; 
    boxes.Add(keyword, txt);
} 

次に、ゲッターは必要ないと思います-ボックス辞書を表示するだけです

public Dictionary<string, TextBox> Boxes { get { return boxes; } }

そして、テキストボックスに興味がなく、値だけが必要な場合:

public Dictionary<string, string> Arguments 
{
  get 
  {
     Dictionary<string, string> vals = new Dictionary<string, string>();

     foreach(KeyValuePair<string, TextBox> kvp in boxes) 
     {
       vals.Add(kvp.Key, kvp.Value.Text);
     }

     return vals;
   }
}
于 2012-05-17T17:51:48.010 に答える