- PR -

[ASP.NET : C#] コントロールの動的追加方法

投稿者投稿内容
麒麟 様
会議室デビュー日: 2006/06/23
投稿数: 2
投稿日時: 2006-06-23 16:24
そのままはインスタンスに設定させないことの可能性がありますので、コントロールを循環に生み出してみました、少しいよいと思います。

コード
--------------------------------------------------------------------------------
protected TextBox[] _textBoxes;
protected void addButton(object sender, System.EventArgs e)
{
if (_textBoxes != null)
{
return;
}
_textBoxes = new TextBox[3];
for(int i = 0; i < _textBoxes.Length; i++)
{
_textBoxes[i] = new TextBox();
_textBoxes[i].ID = "XXXX";
Form1.Controls.Add(_textBoxes[i]);
}
}
--------------------------------------------------------------------------------

そうすれば、どうでしょうか?

[ メッセージ編集済み 編集者: 麒麟 様 編集日時 2006-06-23 16:26 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-23 16:36
引用:

未記入さんの書き込み (2006-06-23 16:19) より:

もともと、行おうとしていた処理は、
「DBから値を取得し、その値の個数分テキストボックスを作成する。」
というものですので、それは以下のコードで実現できることを確認しました。


でしたら 10 固定は、保守性に乏しいのではないでしょうか?

引用:

int DataCount = データベース個数取得();
TextBox [] TextBoxes = new TextBox[10];


TextBox[] TextBoxes = new TextBox[DataCount + 1];
ではないのでしょうか。

引用:

じゃんぬねっと様が書かれている、
では、作成されるコントロールの個数が固定されてしまう気がします。


はい、あのコードは、固定的な意味があるものに向いています。
今回の例では、役に立たないコードでしょう。

引用:

根本的な質問なのですが、配列を使用せずに個数の変化するコントロールを動的に作成することは可能なのでしょうか?


そもそも、提示されたコード例では、配列を扱う必要も意味もないですよね?

コード:

    protected void addButton(object sender, System.EventArgs e) {
        int DataCount = データベース個数取得();

        for (int i = 1; i <= DataCount; i++) {
            TextBox oTextBox = new TextBox();
            oTextBox.ID = "TextBox" + i.ToString();
            Form1.Controls.Add(oTextBox);
        }
    }


色々と局所的な変数に変えてはいますが、やっていることは同じです。
Form1.Controls へ追加された後、また新たに別のインスタンスを生成しています。
ピンと来なければ、インスタンスとは何であるかをまず調べる必要があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
会議室デビュー日: 2006/01/19
投稿数: 7
投稿日時: 2006-06-23 17:09
お世話になっております。

引用:

色々と局所的な変数に変えてはいますが、やっていることは同じです。
Form1.Controls へ追加された後、また新たに別のインスタンスを生成しています。
ピンと来なければ、インスタンスとは何であるかをまず調べる必要があります。



なんか言い訳がましいですが、最初以下のようなコードを書いてみて
ボタンをクリックするたびにテキストボックスが増えていくイメージだったんですが、
テキストボックスがひとつのままだったんで、
インスタンス名が同じだと上書きされていっていると考え、
配列ならうまくいくのではないかと思いました。


コード:

protected void AddButton(object sender, EventArgs e){

TextBox TextBoxes = new TextBox();
TextBoxes.ID = "TextBox" + (int)Session["TextBoxesNo"];
Form1.Controls.Add(TextBoxes);

Session["TextBoxesNo"] = (int)Session["TextBoxesNo"] + 1;
}



じゃんぬねっと様のご指摘で考え直してみると、
これだとボタンを押したときのポストバックで画面がリフレッシュされるから、
TextBox の ID が変わるだけで、絶対に一個しかできませんよね...orz

引用:

そもそも、提示されたコード例では、配列を扱う必要も意味もないですよね?



まったくもってその通りです。
申し訳ありませんでしたm(_ _)m


[ メッセージ編集済み 編集者: 未記入 編集日時 2006-06-23 17:15 ]

スキルアップ/キャリアアップ(JOB@IT)