- PR -

[ASP.NET]動的コントロールにリンクを設定したい

1
投稿者投稿内容
AERITH
会議室デビュー日: 2005/10/14
投稿数: 15
投稿日時: 2005-10-14 18:29
はじめまして。
以前よりこちらを使用させて頂いておりましたが、
今回どうしてもわからない部分がありましたのでお知恵を拝借したいと思います。

ASP.NETにてWebアプリケーションを開発中です。
ログイン後、表示されるメニューの数がユーザー区分によって変わるため
コントロールの動的配置のソースを他の掲示板で見つけたものを使用しています。

While dr.Read() = True

tr = New HtmlTableRow
tc1 = New HtmlTableCell
tc2 = New HtmlTableCell
btn = New Button
lbl = New Label
tc1.Style("Position") = "Absolute"
tc1.Style("top") = 105 + iCnt * 50
tc1.Style("left") = "350px"
tc2.Style("Position") = "Absolute"
tc2.Style("top") = 100 + iCnt * 50
tc2.Style("left") = "400px"
tc1.Style("width") = "30px"
tc2.Style("width") = "220px"
btn.Style("width") = "100%"
lbl.Style("width") = "100%"
tc1.Controls.Add(New LiteralControl(iCnt))
tc2.Controls.Add(btn)
tr.Cells.Add(tc1)
tr.Cells.Add(tc2)
btn.Text = dr.Item("menu_name")
lbl.Text = dr.Item("user_kbn")
table1.Rows.Add(tr)

End While

上記がそのコードになり、drはexecutereader()で取得したSQLの結果を入れてます。
現状このコードにてメニューマスタから最適なメニューを取得できているのですが、
今度はボタン部分にリンク機能を付けたい所で詰まっています。
単純にjavascriptで

tc2.Attributes.Add("onclick", "javascript:href='A.aspx'")
(※実際はA.aspxの部分はdr.item("link")として同じように格納していきたいと考えてます)

とすれば動的に配置されたButtonオブジェクトにリンクが貼れると思ったのですが
クリックしても(現在のページの)page_loadが走るだけで、目的のA.aspxに遷移できませんでした。


動的にコントロールを配置すると同時に、そのコントロールにそれぞれリンク機能を持たせるにはどのようにすればよろしいでしょうか?
よろしくお願いいたします。
葉瀬崎浩樹
大ベテラン
会議室デビュー日: 2005/06/28
投稿数: 115
お住まい・勤務地: 兵庫県
投稿日時: 2005-10-14 23:56
こんにちは。
読み違いをしているかも知れませんが。

とりあえず、リンクが張れればよいのであれば、
WebサーバコントロールのHyperLinkを使ってはいかがでしょうか。
ImageURLを使用してボタン風に見せることも出来ます。

LinkButtonも使用できますが、これはPostBackが走るので、
サーバ側で適切な画面に遷移させてやる必要があります。
(これは、お望みの挙動ではないでしょうね)

要望が「ボタンにリンク機能をつけたい」ということでしたら、
残念ながらその方法は、知りません。
違ったことを言っていたらご免なさい。

HyperLinkを使った場合(C#で書いてます)
コード:
HyperLink btn = new HyperLink(); 
btn.Text = "会議室";
btn.NavigateUrl = "http://www.atmarkit.co.jp/bbs/phpBB/index.php";



では。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-10-15 03:32
こんにちは、でっちです。

引用:

tc2.Attributes.Add("onclick", "javascript:href='A.aspx'")
(※実際はA.aspxの部分はdr.item("link")として同じように格納していきたいと考えてます)

とすれば動的に配置されたButtonオブジェクトにリンクが貼れると思ったのですが
クリックしても(現在のページの)page_loadが走るだけで、目的のA.aspxに遷移できませんでした。



とりあえず「ボタン押下でPostBackせずに画面遷移したい」が目的だと仮定して返答します。

・1つ目
 「tc2」はHtmlTableCellで宣言されていますよね。
 HTMLで言えばTDタグですので、onclickのイベントは発生しません。
 onclickは「btn」にAddして下さい。

・2つ目
 Javascriptが誤っています。正しくはlocation.href="...です。

・3つめ
 PostBackが不要であれば、ボタンは以下のどちらかを使用した方が良いです。
 System.Web.UI.HtmlControls.HtmlInputButton
 System.Web.UI.HtmlControls.HtmlButton
 ソースの通りSystem.Web.UI.WebControls.Buttonを使用する必要がある場合は、
 onclickをAddする時に"Javascript:location.href='A.aspx';return false;"
 と最後にfalseを返さないとPostBackされてしまい、画面遷移が行われません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2005-10-15 09:05
引用:

でっち6号さんの書き込み (2005-10-15 03:32) より:

 HTMLで言えばTDタグですので、onclickのイベントは発生しません。
 onclickは「btn」にAddして下さい。


あれ?そうでしたっけ?
MSDN の td 要素 の説明によると、td 要素 にも onclick イベント が定義されています。
_____________________________________________________________________________
□ Posted by Jitta on 2005/10/15
□ Microsoft MVP :Visual Developer ASP/ASP.NET Oct.2005-Sept.2006
_________________
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-10-15 11:15
こんにちは、じゃんぬ です。

引用:

Jittaさんの書き込み (2005-10-15 09:05) より:

MSDN の td 要素 の説明によると、td 要素 にも onclick イベント が定義されています。


W3C 仕様的にも OK のようです。
http://www.hajimeteno.ne.jp/html40/t/td.html

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-10-15 14:51
ぐは!しまった。
Jittaさん、じゃんぬさん、ご指摘ありがとうございますm(_ _)m

>>AERITHさん
とはいえ、TableCellにつけてもボタンクリック時にイベントが走らないことに変わりありませんので、対応内容は変わりありません。

※一応訂正表
誤:HTMLで言えばTDタグですので、onclickのイベントは発生しません。
正:HTMLで言えばTDタグですので、onclickの属性をつけたとしてもボタン押下時にはイベントは発生しません。
AERITH
会議室デビュー日: 2005/10/14
投稿数: 15
投稿日時: 2005-10-17 09:15
こんにちは、AERITHです。お返事遅れてすみません。

葉瀬崎浩樹さん、でっち6号さん、Jittaさん、じゃんぬねっとさん、
ご回答ならびに丁寧な解説ありがとうございます。

こちらの考えている挙動がはっきりと伝えきれていなかったようで申し訳ありません。
でっち6号さんのおっしゃるように、「ボタン押下でPostBackせずに画面遷移したい」というのが今回の主旨でした。
またオブジェクトに関してはボタンでなくても構わなかったので、こちらも記述するのを失念しておりました。

さて、ご教授頂いた
>ソースの通りSystem.Web.UI.WebControls.Buttonを使用する必要がある場合は、
>onclickをAddする時に"Javascript:location.href='A.aspx';return false;"
>と最後にfalseを返さないとPostBackされてしまい、画面遷移が行われません。

を指定することによって、無事画面遷移が行われました。
これから時間を見つけて
>PostBackが不要であれば、ボタンは以下のどちらかを使用した方が良いです。
>System.Web.UI.HtmlControls.HtmlInputButton
>System.Web.UI.HtmlControls.HtmlButton
のやり方と葉瀬崎浩樹さんのHyperLinkの方も試してみようと思います。

それよりもまずはマスタから動的にリンクを設定する所ですけど^^;

>>でっち6号さん
>とはいえ、TableCellにつけてもボタンクリック時にイベントが走らないことに変わりありませんので、
>対応内容は変わりありません。
とありましたが、TableCellを修正せずに教えて頂いたJavascriptの部分を修正するだけで機能しました。
でっちさんのおっしゃる「イベント」と私が考えてる「リンクの挙動」というのはもしかして別物なのでしょうか…。
もしよろしければご回答願います。


皆様のお陰で無事動作いたしました。
また何かあればお願いしたいと思います。

それでは。
でっち6号
大ベテラン
会議室デビュー日: 2005/01/31
投稿数: 176
お住まい・勤務地: Kawasaki
投稿日時: 2005-10-17 10:07
恥の上塗り
申し訳ないです。。。
下位要素は上位要素のイベントも引き継ぐのですね orz

恥かきついでに色々と実験してみました。
btnに相当するコントロールは大体どんなコントロールでもクリックイベントを引き継ぐようです。(実験したもの:LinkButton,Label,ImageButton)
コントロールまで動的に変えたい場合に使えそうですね。
勉強になりました。
1

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