- - PR -
[VS2005 ASP.NET C♯]GridViewの動的作成テンプレートのポストバック時の値取得について
1|2|3|4|5
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-02-15 21:50
初めまして、のぉりぃといいます。
最近、コーディングをしはじめました。 そこで、問題に直面しています。 GridViewのテンプレートフィールド、アイテムテンプレートをDBから取得してきたデータの数に応じてテキストボックスを動的に作成して表示はできています。その後、テキストボックスの値を変更したあとに単体のボタンをクリックすることによりデータの更新を行いたいのですが、ポストバック後にテキストボックスの値が取れません。静的にデザイナで宣言しているフィールドについては取得できます。EnableViewStateもtrueに設定しています。 動的に作成したテンプレートフィールドのコントロール(テキストボックス)をポストバック後にデータ取得することはできないのでしょうか?ボタンクリックイベントでデータの更新を行いたいのですが。。。 もし、ご存知の方がいたら知恵を貸していただけないでしょうか? | ||||||||
|
投稿日時: 2007-02-15 23:40
データの数って、行の数ですか?列の数ですか?
コントロール自体が取得できないのですか?取得できたけどDBへの反映方法がわからないのですか? | ||||||||
|
投稿日時: 2007-02-16 06:12
ViewStateを保持するには、TextBoxの追加を(3)のLoadViewState以前に行う 必要があります。 TextBoxの追加処理を、PreInit(),OnInit()で行っているか確認してください。 GridViewのカラムをダイナミックに生成する http://www.gxbrbwda.sv02.fsdotnet.net/Goto.aspx?id=061129VB-1 ※どうしても、PreInit(), OnInit()でTextBoxを追加できないときは、 GridViewをPlaceHolderにダイナミックに追加してみてください。 この場合、TrackViewState()が作動してViewStateが保持されます。 Page Life Cycle: (1)PreInit (2)OnInit (3)LoadViewState(IsPostBack=true) (4)LoadPostBackData(IPostBackDataHandler) (5)Page_Load (6)Control Event Handlers (7)PreRender (8)SaveViewState (9) Render (10)Unload _________________ ASP.NET+Ajaxサンプル集 [ メッセージ編集済み 編集者: Access 編集日時 2007-02-16 06:14 ] | ||||||||
|
投稿日時: 2007-02-16 12:23
>べるさん、Accessさん
返答ありがとうございます。 >べるさん データの数だけColumnにTemplateFieldを追加しています。 ItemTemplateのTextBoxはDataBindingのイベントで追加しています。 public class inputGridViewTemplate : ITemplate { int count; public inputGridViewTemplate(int _count) { count = _count; } public void InstantiateIn(Control container) { System.Web.UI.WebControls.TextBox test = new System.Web.UI.WebControls.TextBox(); test.DataBinding += new EventHandler(test_DataBinding); container.Controls.Add(test); } public void test_DataBinding(object sender, EventArgs e) { System.Web.UI.WebControls.TextBox test = (System.Web.UI.WebControls.TextBox)sender; GridViewRow container = (GridViewRow)test.NamingContainer; test.Text = DataBinder.Eval(container.DataItem, "カテゴリー名" + Count).ToString(); test.ID = "test"; test.EnableViewState = true; } } Template作成の記述はGridViewにBindする前にしています。 データを取得したいイベントはボタンクリックイベントです。 コントロール自体が取得できません。 動的に作成したカラムだけが消えている状況です。 >Accessさん GridViewをデータバインドしたあとにPlaceHolderのControlsに追加したのですが、 データを保持できませんでした。 どうしても、OnInitに書けない事情があります。(OnInitの時点で動的に作成する数がわからない) OnInitに記述したとしても作成のタイミングはDataBind時なので意味がないという状況です。 せっかく、丁寧に答えてもらったのにすみません。 何か良い方法はないでしょうか? | ||||||||
|
投稿日時: 2007-02-16 12:50
コードが何しているのかよく分かりませんが、Page の Load イベントでの TextBox 追加でも間に合いますよ。
(ViewState復元とPostデータのセットによる差異チェックは Laod の前と後で2回チャンスがある) Page_Load の時点でも数がわかりませんか? _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2007-02-16 13:17
>囚人さん
返答ありがとうございます。 Page_Load時にはColumnに追加する数はわかります。 そして、PostBack時にはTemplateFieldの追加を行っていません。 ViewStateの復元ですか。調べてみます。 | ||||||||
|
投稿日時: 2007-02-16 13:26
誤解のある書き方をしました。すみません。
ViewState の復元は自動でやってくれますし、Postデータのセットも自動でやってくれます。 しかし、Post データのセットの後のタイミングでコントロールを作成すると、Post データが拾えません。 で、Page の Load イベントの前と後で Post データのセット(2回目は動的作成コントロール用)をやっているので、Load イベントでごにょごにょすれば、多分いけます。
状況がよく分かっていませんが、PostBack時にも追加を行ったら解決するのでは? _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2007-02-16 14:04
>囚人さん
返答ありがとうございます。 毎回Page_Load時にTemplateFieldを作成したらいいわけですね。 ということは、TextBox設定のイベントハンドラがDataBindingでは駄目ですね。 |
1|2|3|4|5
次のページへ»