- PR -

動的にコントロールを作成するには?

投稿者投稿内容
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2004-08-20 22:21
たびたび、お世話になっています。

ASP.NET(VB.NET)で開発してます。

今回したことは、DBから取得したデータ(名称)をリンクボタンのとして
表示させたいです。
(メニューマスタからデータを取得しリンクボタンとして表示させ、
クリックしたらページ移動する)

動的にコントロールを作成するには、
Protected Form1 As System.Web.UI.HtmlControls.HtmlForm
Protected WithEvents LinkBtn1 As System.Web.UI.WebControls.LinkButton
と宣言しLinkBtn1のプロパティを設定しフォーム(Form1)に
加えればいいというのは分かっています。

Protected WithEvents LinkBtn1 As System.Web.UI.WebControls.LinkButton
の部分は動的に宣言できないのでしょうか?

よろしくお願いします。
ZEBRA
常連さん
会議室デビュー日: 2003/04/14
投稿数: 38
投稿日時: 2004-08-20 23:17
GotDotNetJapan<http://www.gotdotnet.com/team/ja/>
の「旧メーリングリスト」にWebコンポーネントの動的追加の記事が載っています。
ご参考までに…
<http://www.gdncom.jp/general/mllog/tech/techDetail.aspx?ID=543>
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-21 08:52
引用:

みのるさんの書き込み (2004-08-20 22:21) より:

Protected WithEvents LinkBtn1 As System.Web.UI.WebControls.LinkButton
の部分は動的に宣言できないのでしょうか?


 いや、あの、そんなことしたら、クラスの構造が変わってしまいます

 「何をいくつ追加するかなんて、わからない」ということなら、例えばArrayListを使う方法があります。

とりあえず、配列での例、、、って、数量固定ですが、その辺は適切に変更してください。
ついでにC#ですが、それも適切に変更してください。別の、メールでの問い合わせで、サンプルとして作ったものに手を加えたものなので。
コード:
namespace WebSample1
{
	/// <summary>
	/// WebForm1 の概要の説明です。
	/// </summary>
	public class WebForm1 : System.Web.UI.Page
	{
		private System.Collections.Specialized.StringCollection dsource;
		protected System.Web.UI.WebControls.Label Label1;
		protected System.Web.UI.WebControls.DropDownList DropDownList3;
		protected System.Web.UI.WebControls.Panel Panel1; 
		protected System.Web.UI.WebControls.DataList DataList1;

		protected System.Web.UI.HtmlControls.HtmlForm Form1;
		protected System.Web.UI.WebControls.TextBox[] textBox;
        	
		private void Page_Load(object sender, System.EventArgs e)
		{
			// ページを初期化するユーザー コードをここに挿入します。
			if (!this.IsPostBack) {
				dsource = new System.Collections.Specialized.StringCollection();
				dsource.Add("1");
				dsource.Add("2");
				dsource.Add("3");
				DataList1.DataSource = dsource;
				DataList1.DataBind();
			} else {
				textBox[0].Text = "postback";
			}
			this.Page.RegisterStartupScript("body", "<script>document.body.oncontextmenu=new Function('return false;');</script>");
		}

		#region Web フォーム デザイナで生成されたコード 
		override protected void OnInit(EventArgs e)
		{
			textBox = new TextBox[5];
			for (int i = 0; i < 5; i++) {
				textBox[i] = new TextBox();
				textBox[i].ID = "textbox" + i;
				Panel1.Controls.Add(textBox[i]);
			}
			//
			// CODEGEN: この呼び出しは、ASP.NET Web フォーム デザイナで必要です。
			//
			InitializeComponent();
			base.OnInit(e);
		}
		
		/// <summary>
		/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
		/// コード エディタで変更しないでください。
		/// </summary>
		private void InitializeComponent()
		{    
			this.DataList1.ItemCreated += new System.Web.UI.WebControls.DataListItemEventHandler(this.DataList1_ItemCreated);
			this.Load += new System.EventHandler(this.Page_Load);

		}
		#endregion

		private void DataList1_ItemCreated(object sender, System.Web.UI.WebControls.DataListItemEventArgs e) {
			string cntrlName;
			
			if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item) {
				cntrlName = (e.Item.ItemType == ListItemType.AlternatingItem ? "DropDownList2" : "DropDownList1");
				DropDownList lst = (DropDownList) e.Item.FindControl(cntrlName);
				lst.SelectedIndexChanged +=new EventHandler(lst_SelectedIndexChanged);
			}
		}

		private void lst_SelectedIndexChanged(object sender, EventArgs e) {
			DropDownList ddl = (DropDownList) sender;
			Label1.Text = string.Format("{0}の値が{1}に変わりました", ddl.ClientID, ddl.SelectedValue);
		}
	}
}


みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2004-08-23 09:52
ZEBRAさん、ありがとうございます。
なるほど、DataGridを加工して表示するなんて思いつきませんでした。
参考にしたいと思います。

Jittaさん、たびたびありがとうございます。

ArrayListを使う方法で早速試してみました。
で、ひとつ質問です。

今まで、コントロールの宣言を以下のようにしていました。
Protected WithEvents LinkBtn As System.Web.UI.WebControls.LinkButton

WithEventsは配列として型指定はできませんので、以下のように修正しました。
Protected LinkBtn() As System.Web.UI.WebControls.LinkButton

コントロール(リンクボタン)の表示はできたのですが、
リンクボタンボタンのクリックイベントはどのように表現したらいいのでしょうか?

今までは「WithEvents」を付けていたので、以下の様にしていましたが、
「WithEvents」をはずしたので、できなくなってしまいました。

大変お手数ですが、教えていただけませんでしょうか?

Private Sub LinkButton_Click(ByVal sender As System.Object, _
 ByVal e As System.EventArgs) Handles LinkBtn.Click

Dim txtsender As LinkButton
Dim strId As String

txtsender = CType(sender, LinkButton)
strId = txtsender.ID

Select Case strId
  (省)
End Select

End Sub

[ メッセージ編集済み 編集者: みのる 編集日時 2004-08-23 11:12 ]

[ メッセージ編集済み 編集者: みのる 編集日時 2004-08-23 11:39 ]
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2004-08-23 16:12
ZEBRAさんの提案のDataGridを加工する方法、実行してみました。

なかなかいい感じです。
(参考のHPにもあったように「縦しか追加できない」という点を
除けば)

Jittaさん、やはりWithEventsでコントロールを宣言しないと
イベントが拾えないので、

コントロールのMAXの和だけ宣言し、
DBから取得したデータの和分だけ
コントロールのプロパティを設定してFORMに
追加するしかないかなぁと思っています。
(かなりのソースの量になりますが。。。。)

いろいろとありがとうございます。

ちょっと欲張って、TreeViewに挑戦したいと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-23 16:20
引用:

みのるさんの書き込み (2004-08-23 16:12) より:

Jittaさん、やはりWithEventsでコントロールを宣言しないと
イベントが拾えないので、


 AddEventHanderで追加してやれば、拾えるでしょう?
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2004-08-23 17:45

>AddEventHanderで追加してやれば、拾えるでしょう?

AddHandler??ですか?

「AddHandlerを使用したイベントの処理」は初めてなので、
しばらく勉強したいと思います。
みのる
大ベテラン
会議室デビュー日: 2003/07/03
投稿数: 100
投稿日時: 2004-08-23 18:18
イベント拾えましたー!!

いろいろとありがとうございました。

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