6

C# は制御配列にインデックスを付けていますか? たとえば、この5つのコントロールすべてのインデックスを処理する1つのイベントハンドラーを使用する5つのボタンを使用して、「ボタン配列」を配置したいと思います(VB6のように)。それ以外の場合は、これら 5 つのボタンのそれぞれについて、追加のイベント ハンドラーを 1 つ記述する必要があります。また、100 個のボタンがある場合、100 個のイベント ハンドラーが必要ですか? 私はそのようなことを意味します:

TextBox1[i].Text="Example";

制御配列を使用することで、コーディングが間違いなく簡単になる可能性があります。これで、C# には少なくともユーザー コントロールに表示される配列機能がなく、ユーザー コントロールに "index" プロパティがないことがわかりました。したがって、C# には制御配列がないと思います。または、各要素を既知の名前で呼び出す必要があります。

for ループで 100 個の値をインクリメントする 100 個の TextBoxes を指定する代わりに、次のように記述する必要があります。

TextBox1.Text = Value1;
TextBox2.Text = Value2;
...
...
TextBox100.Text = Value100;

さらに多くの作業と、TextBox を 1 つ追加するための 100 個のイベント ハンドラーすべてです。

4

7 に答える 7

8

私はこのパーティーに少し遅れていることを知っていますが、この解決策はうまくいきます:

グローバル配列を作成します。

    TextBox[] myTextBox;

次に、オブジェクトのコンストラクターで、への呼び出しの後

    InitializeComponent();

配列を初期化します。

    myTextBox = new TextBox[] {TextBox1, TextBox2, ... };

これで、コントロールの配列を繰り返すことができます:

    for(int i = 0; i < myTextBox.Length; i++)
        myTextBox[i].Text = "OMG IT WORKS!!!";

これが役立つことを願っています!

ピート

于 2015-05-10T13:34:43.467 に答える
3

HatSoft によるソリューションへのコメントで述べたように、C# Winforms では、古い VB6 で許可されていたようなコントロール配列を作成することはできません。私たちが到達できる最も近いものは、HatSoft と Bert Evans が投稿で示したものです。

あなたの要件を満たすことを願っていることの1つは、イベントハンドラーです。一般的なイベントハンドラーを取得し、イベントハンドラーで「送信者」を型キャストすると、VB6の場合と同じように直接コントロールを取得します

C#

TextBox textBox = sender as TextBox;

VB6

TextBox textBox = TextBox1[i];

したがって、100 個の TextBoxes を単一のイベント ハンドラーに配線することが唯一の問題です。コードを使用してコントロールを動的に作成するのではなく、設計時に手動で作成する場合は、Panel などのコンテナーにグループ化することをお勧めします。次に、フォーム ロードで、次のようにすべてを 1 つのイベント ハンドラーに結び付けます。

foreach (Control control in myTextBoxPanel.Controls)
{
    if(control is TextBox)
         control.TextChanged += new EventHandler(control_TextChanged);
}
于 2012-07-24T04:10:52.080 に答える
2

for ループで 100 個の値をインクリメントする 100 個の TextBoxes を指定する代わりに、次のように記述する必要があります。

for(int i = 0; i <100; i++)
{
   TextBox t = new TextBox(){ Id = "txt_" + i, Value = "txt_" + i};
   t.TextChanged += new System.EventHandler(this.textBox_Textchanged);
  Page.Controls.Add(t);

}

//and for event on TextChanged
private void textBox_Textchanged(object sender, EventArgs e)
    {
        TextBox textBox = sender as TextBox;

        if (textBox != null)
        {
////
        }
    }
于 2012-07-23T21:48:11.790 に答える
2

ハンドラーを 1 つ作成し、すべてのボタンをそのハンドラーに向けるだけです。

var ButtonHandler = (sender, args) => {
    var clicked = (Button)sender;
    if (clicked.Text == "whatever")
       //do stuff
    else
       //do other stuff 
};

button1.Click += ButtonHandler;
button2.Click += ButtonHandler;

または、コードでコントロールを作成している場合は、この回答で指定されている手法のいずれかを使用できます。

于 2012-07-23T21:44:59.730 に答える
0

MVC ではなく Web フォームを使用している場合は、ASP.NET Web ページでコントロール コレクションを使用する に示すように、ページ上のコントロールのコレクションにアクセスできます。基本的に、コントロール コレクションは、第 1 レベルの子コントロールと独自の子を持ついくつかの項目をホストするページを持つツリーです。ツリーをたどる方法の例については、 「方法: コントロール コレクションをウォークしてページ上の Web フォーム コントロールを見つける」を参照してください。

また、「方法: プログラムによって ASP.NET Web ページにコントロールを追加する 」も参照してください。

必要な署名が同じである限り、複数のアイテムに同じイベント ハンドラーを使用できます。

Windows フォームの場合、類似のアーキテクチャ モデルに基づいているため、これはほぼ同じですが、Control.Controls プロパティ方法: コントロールを Windows フォームに追加するが必要です。

于 2012-07-23T21:48:56.070 に答える