- PR -

[VS2005 ASP.NET C♯]GridViewの動的作成テンプレートのポストバック時の値取得について

投稿者投稿内容
のぉりぃ
会議室デビュー日: 2007/02/15
投稿数: 14
投稿日時: 2007-02-15 21:50
初めまして、のぉりぃといいます。
最近、コーディングをしはじめました。

そこで、問題に直面しています。
GridViewのテンプレートフィールド、アイテムテンプレートをDBから取得してきたデータの数に応じてテキストボックスを動的に作成して表示はできています。その後、テキストボックスの値を変更したあとに単体のボタンをクリックすることによりデータの更新を行いたいのですが、ポストバック後にテキストボックスの値が取れません。静的にデザイナで宣言しているフィールドについては取得できます。EnableViewStateもtrueに設定しています。
動的に作成したテンプレートフィールドのコントロール(テキストボックス)をポストバック後にデータ取得することはできないのでしょうか?ボタンクリックイベントでデータの更新を行いたいのですが。。。

もし、ご存知の方がいたら知恵を貸していただけないでしょうか?
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-02-15 23:40
引用:
GridViewのテンプレートフィールド、アイテムテンプレートをDBから取得してきたデータの数に応じてテキストボックスを動的に作成して表示はできています。

どのイベントハンドラで追加してますか?そしてそのコードは?
データの数って、行の数ですか?列の数ですか?

引用:
その後、テキストボックスの値を変更したあとに単体のボタンをクリックすることによりデータの更新を行いたいのですが、ポストバック後にテキストボックスの値が取れません。静的にデザイナで宣言しているフィールドについては取得できます。

どこのイベントハンドラで取得しようとしてますか?そのコードは?

コントロール自体が取得できないのですか?取得できたけどDBへの反映方法がわからないのですか?
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 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/15
投稿数: 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時なので意味がないという状況です。
せっかく、丁寧に答えてもらったのにすみません。
何か良い方法はないでしょうか?
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-02-16 12:50
コードが何しているのかよく分かりませんが、Page の Load イベントでの TextBox 追加でも間に合いますよ。
(ViewState復元とPostデータのセットによる差異チェックは Laod の前と後で2回チャンスがある)
Page_Load の時点でも数がわかりませんか?

_________________
囚人のジレンマな日々
のぉりぃ
会議室デビュー日: 2007/02/15
投稿数: 14
投稿日時: 2007-02-16 13:17
>囚人さん
返答ありがとうございます。
Page_Load時にはColumnに追加する数はわかります。
そして、PostBack時にはTemplateFieldの追加を行っていません。
ViewStateの復元ですか。調べてみます。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-02-16 13:26
誤解のある書き方をしました。すみません。
ViewState の復元は自動でやってくれますし、Postデータのセットも自動でやってくれます。
しかし、Post データのセットの後のタイミングでコントロールを作成すると、Post データが拾えません。
で、Page の Load イベントの前と後で Post データのセット(2回目は動的作成コントロール用)をやっているので、Load イベントでごにょごにょすれば、多分いけます。

引用:

そして、PostBack時にはTemplateFieldの追加を行っていません。


状況がよく分かっていませんが、PostBack時にも追加を行ったら解決するのでは?
_________________
囚人のジレンマな日々
のぉりぃ
会議室デビュー日: 2007/02/15
投稿数: 14
投稿日時: 2007-02-16 14:04
>囚人さん
返答ありがとうございます。
毎回Page_Load時にTemplateFieldを作成したらいいわけですね。
ということは、TextBox設定のイベントハンドラがDataBindingでは駄目ですね。

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