2017-04-03 11 views
2

私はwinformsのテキストボックスを初期化するこのコードを持っています。このC#コードを一般化するには?

txt0.Text = steps[0]; 
txt1.Text = steps[1]; 
txt2.Text = steps[2]; 
txt3.Text = steps[3]; 

私はこのようにそれを一般化したいと思います:

for (int i = 0; i < steps.Length; i++) 
{ 
    txti.Text = steps[i]; 
} 

明らかにこれはthe name txti does not exist in current contextので動作しません。 どのように動作させるには?

EDIT: すべてのテキストボックスとピクチャボックスをコードで作成し、コード内のtablelayoutpanelに追加しないようにします。

+5

4つのテキストボックスではなく、配列またはテキストボックスのリストが必要です。したがって、 'txt0'の代わりに、' txt [i] 'が必要です。 – HimBromBeere

+0

これはwinformsですか? wpf?ウェブフォーム? asp.net mvc?シルバーライト?私が忘れてしまったいくつかの他のUIフレームワーク? –

+0

それはwinformsなので、そこにすべてのテキストボックスの配列を作成する方法がわかりません –

答えて

1

元の質問のコードは、次のように一般化できます。

var TextBoxes = new TextBox[]{ txt0, txt1, txt2, txt3 }; 
for (int i = 0; i < TextBoxes.Length; i++) 
{ 
    TextBoxes[i].Text = steps[i]; 
} 
+0

ありがとうございます。あなたは最初の答えでした。 –

2

あなたは反射で行うことができますが、この作業を解決するためにはお勧めできません。

代わりにリストとループがあります。

List<TextBox> textBoxes = new List<TextBox> {txt0,txt1,txt2,txt3}; 
for (int i = 0; i < textBoxes.Length; i++) 
{ 
    textBoxes[i].Text = steps[i]; 
} 
+0

なぜあなたはここで反射を述べたのですか? :) – Fabio

+0

テキストボックスをスタイリングし、デザイナーで既に作成したときにコードを使ってコンテナに追加するのはどうですか?悪夢のように聞こえる。 –

+0

@ファビオ、本当 - 私はそれを削除する必要があります。 –

1

テキストボックスを動的に参照するために型キャストを行うことができます。

for (int i = 0; i < steps.Length; i++) 
{ 
    TextBox txt = this.FindControl("txt" + i.ToString()) as TextBox; 
    txt.Text = steps[i]; 
} 
+0

ありがとう、私はこれを試してみます。 –

+0

'FindControl'を使うときは、' null'をチェックする必要があります – bradbury9

+1

これはリストを正しい順序で返しますか? – user5226582

1

あなたは自分の名前でコントロールを見つける試すことができます:それはあなたがあなたのTextBoxNameプロパティを使用することができますWinFormsなので

for (int i = 0; i < steps.Length; i++) 
    Controls.Find("txt" + i, true)[0].Text = steps[i]; 
1

。あなたのControl

for(int i = 0; i < steps.Length; i++) 
{ 
    TextBox tBox = this.Controls.OfType<TextBox>().FirstOrDefault(t => t.Name == "txt" + i); 
    if(tBox == null) break; 

    tBox.Text = steps[i]; 
} 

Nameプロパティは、あなたが意味を使用する変数名に対応していること、あなたはそれが名前が、それは、この名前を使用して親Controlだから、それは本当に簡単に取得できるようになり"txt0"がされていあなたのTextBoxtxt0として呼び出す場合。

1

Winformsには、コレクションデータを表示するための「正しい」コントロール - たとえばDataGridViewがあります。

yourDataGridView.DataSource = steps.ToList(); 

DataGridView行とstepsの値を含むであろう一つの列を生成します。自動生成列の場合は、yourDataGridView.AutoGenerateColumns = true - (デフォルトではtrue

DataGridView.DefaultCellStyleプロパティなどを使用して、生成されたセルを「スタイル設定」することができます。

テキスト以外の表示イメージが必要な場合は、DataGridViewが「正しい」選択肢と思われます。
はステップ

public class Step 
{ 
    public string Name { get; set; } 
    public Image StatusImage { get; set; } 
} 

// Create collection 
var steps = new List<Step> 
{ 
    new Step { Name = "One", StatusImage = image1 }, 
    new Step { Name = "Two", StatusImage = image1 }, 
    new Step { Name = "Three", StatusImage = image1 } 
} 

yourDataGridView.DataSource = steps; 

DataGridViewのデータ構造はStatusImageプロパティのDataGridViewImageColumnを生成する必要が表すクラスを作成します。

画像の代わりにStepStatusの列挙型がある場合は、次に、DataGridView.CellFormattingイベントを使用して、enumをイメージに変換できます。

+0

ありがとうが、間違った名前が付けられた場合のnull戻り値を確認することは良い考えです。それは問題ではありませんでしたが、すべてのテキストボックスは、ステップが完了した後にステータス画像と関連付けられたピクチャボックスを持っています。どのように私はそれを使用するだろうと私はwinforms DataGridViewを使用したことはありません。 –

+0

'DataGridVIewImageColumn'に画像を表示し、更新された答えを確認できます。 – Fabio

関連する問題