- - PR -
列の作成とPostBackについて
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-09-12 20:46
現在 ASP.NET(C#)とSQLServer2000を利用してWeb開発を行っています。
苦戦している部分がありまして 相談させてください。 画面にドロップダウンリストとデータグリッドとボタンを配置。 ドロップダウンリストにリスト作成。 初期表示時は渡されたパラメータ値をリストの選択値とする。 それをキーにSQLでグリッドの追加列数を取得。 グリッドに列追加(テキストボックス列含む)。 表示データを取得。 グリッドに表示。 列数の決定と列追加はonInitでやっています。 画面表示後、ドロップダウンリストで選択しなおしたときも、 それをキーに上記処理を行いたいのですが、 DropDownList_SelectedIndexChangedより前にonInitが走り、 選択前の状態で列追加を行ってしまいます。 このことからやり方をかえて 列数の決定と列追加は、onInitではなくデータ表示時(初期表示&リスト選択時)で 毎回やるように変えたところ、 表示に関してはうまくいきました。 ところがボタンを押して、グリッドの値を取得しようとしたところ、 indexがありません、とエラーになってしまいます。 DataGrid.Columns.Countをとると、作成した列数が返ってくるのですが、 プログラム内で追加した列を取得(DataGrid.Items[0].Cell[1].Text等)するとだめです。 取得前にもう一度列追加の処理をしてみましたが、それでもだめです。 このような処理を行いたい場合、どういう風に記述していますか? どなたかわかる方いらっしゃいましたら ぜひよろしくお願いします。 | ||||||||
|
投稿日時: 2005-09-12 22:50
こんにちわ。
日本語でヅラヅラ書かれると、辛いものがありますね。 コードを出してみるか、出せないなら例でコードを書かれる事をお勧めします。 それでご質問の内容ですが、 http://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/ImpPageController.asp ここの最初のほうに、ASP.NET がどういう処理順序で実行されているのかが書かれています。ヒントになると思います。 | ||||||||
|
投稿日時: 2005-09-13 12:38
デザインで書いた場合はうまくいくのですか? | ||||||||
|
投稿日時: 2005-09-13 15:13
囚人さん 早速のお返事ありがとうございます。
非常に長くて恐縮ですが ひとまずサンプルコードを記述しました。 教えていただいたページで勉強してみます。 -- @列をOninitで作成 aspx.cs private TestInpAction testInpAction = new TestInpAction(); private void Page_Load(object sender, System.EventArgs e) { if (! IsPostBack) { //DB接続等 ・・・ //データ表示 showData(DropDownList1.SelectedItem.Value); } } #region Web Form Designer generated code override protected void OnInit(EventArgs e) { // // CODEGEN: この呼び出しは、ASP.NET Web フォーム デザイナで必要です。 // InitializeComponent(); base.OnInit(e); //カラム作成 CreateGridColumns(); } #endregion //カラム生成 private void CreateGridColumns() { //キー string ymd = lblYmd.Text.Replace("/",""); //DB接続Open ・・ if (!isPostBack) { //ドロップダウンリスト作成 CreateDropDownList(DropDownList1, testInpAction.Connection()); } string cd = DropDownList1.SelectedItem.Value; //グリッド件数取得 int cnt = 0; if (! testInpAction.GetCount(Int.Parse(cd), Int.Parse(ymd), out cnt)) { return; } //グリッド列作成 for (int i = 0; i < cnt ; i++) { BoundColumn Col = new BoundColumn(); Col.DataField = "s_cd" + i.ToString(); dgDataGrid.Columns.Add(Col); } //DB接続Close ・・ } //ドロップダウンリスト変更 private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) { //ここでonInitへゆく //データ表示 showData(DropDownList1.SelectedItem.Value); } -- A列をOninitで作成せず、グリッド表示時に毎回作成するパターン aspx.cs private TestInpAction testInpAction = new TestInpAction(); private void Page_Load(object sender, System.EventArgs e) { if (! IsPostBack) { //DB接続Open ・・ //ドロップダウンリスト作成 CreateDropDownList(DropDownList1, testInpAction.Connection()); //カラム作成 CreateGridColumns(DropDownList1.SelectedItem.Value); //データ表示 showData(DropDownList1.SelectedItem.Value); } } //カラム生成 private void CreateGridColumns() { //キー string ymd = lblYmd.Text.Replace("/",""); string cd = DropDownList1.SelectedItem.Value; //DB接続Open ・・ //グリッド件数取得 int cnt = 0; if (! testInpAction.GetCount(Int.Parse(cd), Int.Parse(ymd), out cnt)) { } //グリッド列作成 for (int i = 0; i < cnt ; i++) { BoundColumn Col = new BoundColumn(); Col.DataField = "s_cd" + i.ToString(); dgDataGrid.Columns.Add(Col); } //DB接続Close ・・ } //ドロップダウンリスト変更 private void DropDownList1_SelectedIndexChanged(object sender, System.EventArgs e) { //カラム作成 CreateGridColumns(DropDownList1.SelectedItem.Value); //データ表示 showData(DropDownList1.SelectedItem.Value); } //ボタンクリック private void btnOK_Click(object sender, System.EventArgs e) { //画面の入力内容を取得 //横列数取得 int count = Int.Parse(lblCnt.Text); for (int i = 0; i < dgGrid.Items.Count; i++) { //横展開 for (int j = 0 ; j < count; j++) { //コード //☆ここでSystem.ArgumentOutOfRangeException: 指定された引数は、有効な値の範囲内にありません。パラメータ名 : index s_cd = dgGrid.Items[i].Cells[(int)Column.shohin_Cd + 2*j].Text; } } } | ||||||||
|
投稿日時: 2005-09-13 15:16
todoさん お返事ありがとうございます
デザインで列を作った場合は全く問題なく動きます。 | ||||||||
|
投稿日時: 2005-09-13 18:47
DataGrid.Columns.Clearでお掃除すればよいのでは? | ||||||||
|
投稿日時: 2005-09-13 19:17
todoさん お返事ありがとうございます。 お掃除してみました!! 固定列もすべてコードで作るようにしてcrear&addですね。 早速組み込んでみます。 とても助かりました。 ありがとうございます。 | ||||||||
|
投稿日時: 2005-09-13 20:28
> DataGrid.Columns.Clearでお掃除すればよいのでは?
乱暴でしたね。 DataGrid.Columns.RemoveAt(i)で固定列を除きお掃除する。 [ メッセージ編集済み 編集者: todo 編集日時 2005-09-13 20:32 ] |