- PR -

 Webコントロールのボタンを動的に配置

投稿者投稿内容
ax
常連さん
会議室デビュー日: 2004/04/07
投稿数: 34
お住まい・勤務地: 東京
投稿日時: 2004-12-24 19:00
.NET初心者です。

|---------------------|
|TextBox | Button(削除)|
|---------------------|
|TextBox | Button |
|---------------------|
|TextBox | Button |
|---------------------|

Button(追加)


というような画面(テーブル)を表示し、TextBoxに入力が
できる状態で、動的に行の追加、削除を行いたいと思います。
上記の例でいうと、4行目を入力したい場合は「追加」ボタン
を用意しておいて、クリックすると4行目が現れる、といった
画面にしたいと思っています。テーブルにあるボタンを押すと
その行が削除できるような仕様です。
画面のファイル中にコードを書いてループさせれば間単にでき
るのですが、画面のファイルにコードを書きたくないので、
別ファイルにコードを書いて動的に作成(「追加」ボタンを押
すたびにPostBackさせる等)したいのですが、どのようにすれば
実現できるか分かりません。
良い方法は無いでしょうか。

私の理想としては、ページが表示された際のLoad用関数で
テーブルを(デフォルトで5行表示、TextBoxは空白で)表示させ、
「追加」ボタンを押すとPostBackして一番下に1行追加される、
「削除」ボタンを押すと、押した行のレコードが削除される(
こちらもPostBackで)です。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-12-25 02:29
ボタンクリックのイベントハンドラに
TextBox tb = new TextBox();
TableCell tc = new TableCell();
tc.Controls.Add(tb);
TableRow tr = new TableRow();
tr.Cells.Add(tc);
Table1.Rows.Add(tr);
のようなことを書く。つまり、コントロールをセルに追加し、セルをROW(行)に追加し
ROWをテーブルに追加する、です。削除の場合はRemoveやRemoveAtです。
検索すればサンプルがありそうですね。

・・って、こんな回答を求めてるのではない??

引用:
画面のファイル中にコードを書いてループさせれば間単にでき
るのですが

これはどうやってるのですか?

[ メッセージ編集済み 編集者: べる 編集日時 2004-12-25 11:18 ]
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2004-12-25 11:30
DataGridじゃ駄目なんですよね?きっと・・・

となると、ボタンを押したときの処理はJavaScriptで自前で記述する事になると思います。消したいレコードを一意に識別できるようなIDをURLのパラメータにして呼び出せばよいでしょう。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-12-26 10:28
それか削除用のイベントハンドラを作り、全部のボタンのクリックイベントに登録し、
((Button)sender).ID かなんかで判別するとか。
個人的には、リンクにしちゃってURLのパラメータで渡す方が楽な気もします。
DataGridも、自分の用途にあってるかどうか調べてみるといいと思います。

もしやVS.netは使ってないのですか?コード自動生成がないとそれはそれで
結構めんどくさいですよね。勉強になっていいなぁとは思ってますが。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-12-26 13:05
 DataGridで、空行を1つ追加して追加用にしています。「空行を追加する」ルーチンと、「空行なら削除する」ルーチンが必要ですが。
_________________
ax
常連さん
会議室デビュー日: 2004/04/07
投稿数: 34
お住まい・勤務地: 東京
投稿日時: 2004-12-27 09:48
回答ありがとうございます。

引用:
画面のファイル中にコードを書いてループさせれば間単にでき
るのですが

これはどうやってるのですか?

この場合は画面でタグを書いてる部分にコードを埋め込んで、単純にループしてテーブルの行を制御させてるだけです。ただ、そのコードを画面のファイルに書きたくないので外部ファイルでなんとかしようと思っています。

開発環境はWeb Matrixを使用しています。

回答いただいた方法を検討して作成しています。とりあえず、画面とは別ファイルでボタンとかテキストボックスを動的に配置することは出来たので、こんどはそのボタンにイベントで削除とかの処理ができるようにしてみます。やはりjavascriptでしょうか。
DataGridだと行の追加、削除が自動で出来るかなと思ったんですが、そうでもないんですね。
hira
常連さん
会議室デビュー日: 2004/05/07
投稿数: 33
投稿日時: 2004-12-27 18:15
的外れな回答をしていたらすみません。

Repeaterをつかったらどうでしょうか?
これを使うと、簡単なループ処理が行なわれます。

削除ボタンのイベントは、
RepeterのItemComandイベントで取得し、
e.Item.ItemIndex()で選択行を特定。
あとは、FindControlで取得したい値を取得し
DBへの削除処理。
その後、DBから値を再読み込みして、Repeterに値をDataBind

追加ボタンのイベントは
通常のボタンイベントで取得し、DBへの追加処理
その後、DBから値を再読み込みして、Repeterに値をDataBind

これで、やりたい事はやれるかと・・・
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-12-27 22:20
axさんはDBのことは直接言及されていませんが「ボタンを押すと、押した行の
レコードが削除される」といっているので、DBと連携してるのですよね。

引用:
コードを埋め込んで、単純にループしてテーブルの行を制御させてるだけです

これの詳細を聞きたかったのですが、「別ファイルでボタンとかテキスト
ボックスを動的に配置することは出来た」とのことで、ひとまずはよかったです。

引用:
やはりjavascriptでしょうか

javascriptの話がでてきたのは、どのボタンが押されたかの情報をどうやってサーバに
渡すか、という問題を考えてのことでしょう。
引用:
DataGridだと行の追加、削除が自動で出来るかなと思ったんですが、そうでもないんですね。

DataGridだと、例えば削除ボタンを押した場合、DeleteCommandイベントのハンドラで
何行目のボタンを押したかなどが比較的容易にとれます。Repeaterも含め方法はいろいろ
ありそうです。@ITのなか一通りよめば結構書いてありますしね。

Web Matrixは使ってないし、DataGridもあまり使わないので、
ちょっとおかしなことを言ってたらごめんなさい・・

[ メッセージ編集済み 編集者: べる 編集日時 2004-12-27 22:22 ]

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