たとえば、「表示」ボタンをクリックした後に「n」の値がわかっている場合、対応する「n」個のテキストボックスを持つ「n」個のラベルを動的に作成して表示する方法はありますか。
私の質問が理解できない場合はお知らせください。ありがとうございました!
私は VS C# Express 2010 Windows Form を使用しています。
ラベルとテキストボックスを保持するユーザーコントロールを作成し、そのユーザーコントロールのインスタンスを「n」回作成するだけです。それを行うためのより良い方法を知り、プロパティを使用してユーザーコントロールからラベルとテキストボックスの値にアクセスしたい場合は、私に知らせてください。
それを行う簡単な方法は次のとおりです。
int n = 4; // Or whatever value - n has to be global so that the event handler can access it
private void btnDisplay_Click(object sender, EventArgs e)
{
TextBox[] textBoxes = new TextBox[n];
Label[] labels = new Label[n];
for (int i = 0; i < n; i++)
{
textBoxes[i] = new TextBox();
// Here you can modify the value of the textbox which is at textBoxes[i]
labels[i] = new Label();
// Here you can modify the value of the label which is at labels[i]
}
// This adds the controls to the form (you will need to specify thier co-ordinates etc. first)
for (int i = 0; i < n; i++)
{
this.Controls.Add(textBoxes[i]);
this.Controls.Add(labels[i]);
}
}
上記のコードは、ボタンbtnDisplay
があり、イベントハンドラーonClick
にイベントが割り当てられていることを前提としています。btnDisplay_Click
また、nの値を知っている必要があり、すべてのコントロールを配置する場所を把握する方法が必要です。コントロールには、幅と高さも指定する必要があります。
ユーザーコントロールを使用してこれを行うには、これを行うだけです。
さて、まず最初に、新しいユーザーコントロールを作成し、テキストボックスとラベルをその中に配置します。
それらがと呼ばれているとtxtSomeTextBox
しましょうlblSomeLabel
。背後のコードに次のコードを追加します。
public string GetTextBoxValue()
{
return this.txtSomeTextBox.Text;
}
public string GetLabelValue()
{
return this.lblSomeLabel.Text;
}
public void SetTextBoxValue(string newText)
{
this.txtSomeTextBox.Text = newText;
}
public void SetLabelValue(string newText)
{
this.lblSomeLabel.Text = newText;
}
これで、ユーザーコントロールを生成するコードは次のようになります(MyUserControlは、ユーザーコントロールに付けた名前です)。
private void btnDisplay_Click(object sender, EventArgs e)
{
MyUserControl[] controls = new MyUserControl[n];
for (int i = 0; i < n; i++)
{
controls[i] = new MyUserControl();
controls[i].setTextBoxValue("some value to display in text");
controls[i].setLabelValue("some value to display in label");
// Now if you write controls[i].getTextBoxValue() it will return "some value to display in text" and controls[i].getLabelValue() will return "some value to display in label". These value will also be displayed in the user control.
}
// This adds the controls to the form (you will need to specify thier co-ordinates etc. first)
for (int i = 0; i < n; i++)
{
this.Controls.Add(controls[i]);
}
}
もちろん、ユーザーコントロールにさらにメソッドを作成して、プロパティにアクセスして設定することもできます。または、単に多くのアクセスが必要な場合は、次の2つの変数を入力するだけで、テキストボックスに直接アクセスしてラベルを付けることができます。
public TextBox myTextBox;
public Label myLabel;
ユーザーコントロールのコンストラクターでこれを行います。
myTextBox = this.txtSomeTextBox;
myLabel = this.lblSomeLabel;
次に、プログラムでいずれかのテキスト値を変更する場合は、これを実行します。
control[i].myTextBox.Text = "some random text"; // Same applies to myLabel
お役に立てば幸いです:)
これは、winform にプレースホルダーとして機能する somethink を追加し続けるための簡単な例です。 TableLayoutPanel
そしてそれにコントロールを追加するだけです
for ( int i = 0; i < COUNT; i++ ) {
Label lblTitle = new Label();
lblTitle.Text = i+"Your Text";
youlayOut.Controls.Add( lblTitle, 0, i );
TextBox txtValue = new TextBox();
youlayOut.Controls.Add( txtValue, 2, i );
}
押されたときに n を 5 に設定するボタンがあるとします。このように、フォームにラベルとテキスト ボックスを生成できます。
var n = 5;
for (int i = 0; i < n; i++)
{
//Create label
Label label = new Label();
label.Text = String.Format("Label {0}", i);
//Position label on screen
label.Left = 10;
label.Top = (i + 1) * 20;
//Create textbox
TextBox textBox = new TextBox();
//Position textbox on screen
textBox.Left = 120;
textBox.Top = (i + 1) * 20;
//Add controls to form
this.Controls.Add(label);
this.Controls.Add(textBox);
}
これにより、それらがフォームに追加されるだけでなく、適切に配置されます。