- PR -

動的に作成したhtmlコントロールにrunat属性を追加する方法

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-02 09:49
引用:

saruboboさんの書き込み (2004-02-01 17:53) より:

この方法ではタグの属性として出力されてしまうのです↓
<input type="hidden" name="hidB" runat="server">


 意味がよくわかりません。
引用:

動的に生成したHtmlInputHiddenコントロールにrunat=server属性を追加したい


のではないですか?それ以上に、何が必要ですか?

 それで、参照としてあげたページは見ていただけましたか?読むのが面倒なら、こちらで図化しています。
http://quick-tips.hp.infoseek.co.jp/asp.net/tip.html#EventOrder

 これを見ると、ポストバックされたデータを受け取るのは、Page.Loadイベントより前であることがわかります。『誰がポストされたデータを受け取るんでしょうねぇ?』と付け足した理由がお解りいただけるでしょうか。お解りいただけたなら、なぜ動的に追加したコントロールで値が受け取れないか、またはどこで追加しなければならないか、お解りいただけると思うのですが。おそらく、場所を変えればいけると思います。どこに移すかは、参照としてあげたMSDNのトピックをよく読んでください。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-02 09:51 ]
sarubobo
会議室デビュー日: 2004/01/31
投稿数: 6
投稿日時: 2004-02-02 12:35
Jittaさん、ご回答ありがとうございます。

>意味がよくわかりません。

静的に作成したサーバコントロールはaspxファイル内では
<input type="hidden" name="hidA" runat="server">
の記述になると思うのですが、このコントロールと同じ様に
(サーバコントロールとして)動的コントロールを作成したいという意味
だったのです。Atrribute.addだと実行時にHTMLソースを表示させた
時にタグとして<input type="hidden" name="hidA" runat="server">
書かれてしまうという意味です


>どこに移すかは、参照としてあげたMSDNのトピックをよく読んでください。
よく読んでみます。

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

nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2004-02-02 14:56
自分もずいぶん前に同じような疑問を持ち、結局分からずじまいでそのままとしていたのですが、また興味が沸いたんでちと調べてみました。で・・・・結局根本的にどうしてそうなるのか分からんのですが(爆)、ポストバック時に動的に生成したコントロールに値を入れなおすには、RaisePostBackEventをオーバーライドしてやって、その中で値をセットしてやるとよいようです。
(正確にはPage_Loadイベントが終わったあとのどこかでかな・・・う〜ん?)
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-02-02 15:37
 値を受け取らないなら、こんな風で「値をセットすること」はできますよ。
訂正:
 ソースを確認すると、FORM(はおろか、HTML)の外にコントロールが追加されていました。で、修正すると、値を受け取ることもできます。

Private Sub Page_Init(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles MyBase.Init
' CODEGEN: このメソッド呼び出しは Web フォーム デザイナで必要です。
' コード エディタを使って変更しないでください。
InitializeComponent()

' ページの“初期化”は、ここでする。
' 自動生成されるコメントが間違っている。
Dim AutoText As System.Web.UI.HtmlControls.HtmlInputText
AutoText = New System.Web.UI.HtmlControls.HtmlInputText
AutoText.ID = "autoText"
' ここから下、修正
Dim f As System.Web.UI.HtmlControls.HtmlForm
f = Me.FindControl("Form1")
If Not f Is Nothing Then
f.Controls.Add(AutoText)
Else
Me.Controls.Add(AutoText)
End If
End Sub

Private Sub Page_Load(ByVal sender As System.Object _
, ByVal e As System.EventArgs) Handles MyBase.Load
' ページを初期化するユーザー コードをここに挿入します。
' 正しくは「クライアントから依頼があったときに実行されるコード」
If Me.IsPostBack Then
Dim cntrl As System.Web.UI.Control _
= CType(Me.FindControl("autoText"), System.Web.UI.Control)
If TypeOf cntrl Is System.Web.UI.HtmlControls.HtmlInputText Then
Dim inp As System.Web.UI.HtmlControls.HtmlInputText _
= CType(cntrl, System.Web.UI.HtmlControls.HtmlInputText)
' ここで取得はできませんでした→できるようになりました
Label1.Text = inp.Value
' 値の設定はできました
inp.Value = "CHANGE"
End If
End If
End Sub


[ メッセージ編集済み 編集者: Jitta 編集日時 2004-02-02 15:42 ]
sarubobo
会議室デビュー日: 2004/01/31
投稿数: 6
投稿日時: 2004-02-02 20:34
>動的に生成したコントロールに値を入れなおすには、
>RaisePostBackEventをオーバーライドしてやって、その中で値をセットしてやるとよいよう
>です。

noderaさん、情報ありがとうございます

>値を受け取らないなら、こんな風で「値をセットすること」はできますよ。

Jittaさん、サンプルありがとうございます。
この方法でうまくいきました
ありがとうございました<(_ _)>

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