- PR -

列の作成とPostBackについて

投稿者投稿内容
未記入
会議室デビュー日: 2005/09/12
投稿数: 5
投稿日時: 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/08/13
投稿数: 1019
投稿日時: 2005-09-12 22:50
こんにちわ。

日本語でヅラヅラ書かれると、辛いものがありますね。
コードを出してみるか、出せないなら例でコードを書かれる事をお勧めします。

それでご質問の内容ですが、
http://www.microsoft.com/japan/msdn/practices/type/Patterns/enterprise/ImpPageController.asp
ここの最初のほうに、ASP.NET がどういう処理順序で実行されているのかが書かれています。ヒントになると思います。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-09-13 12:38
引用:

列数の決定と列追加はonInitでやっています。



デザインで書いた場合はうまくいくのですか?
未記入
会議室デビュー日: 2005/09/12
投稿数: 5
投稿日時: 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/12
投稿数: 5
投稿日時: 2005-09-13 15:16
todoさん お返事ありがとうございます
デザインで列を作った場合は全く問題なく動きます。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-09-13 18:47
引用:

DropDownList_SelectedIndexChangedより前にonInitが走り、
選択前の状態で列追加を行ってしまいます。



DataGrid.Columns.Clearでお掃除すればよいのでは?
未記入
会議室デビュー日: 2005/09/12
投稿数: 5
投稿日時: 2005-09-13 19:17
引用:

todoさんの書き込み (2005-09-13 18:47) より:
引用:

DropDownList_SelectedIndexChangedより前にonInitが走り、
選択前の状態で列追加を行ってしまいます。



DataGrid.Columns.Clearでお掃除すればよいのでは?



todoさん お返事ありがとうございます。
お掃除してみました!!

固定列もすべてコードで作るようにしてcrear&addですね。
早速組み込んでみます。

とても助かりました。
ありがとうございます。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2005-09-13 20:28
> DataGrid.Columns.Clearでお掃除すればよいのでは?

乱暴でしたね。
DataGrid.Columns.RemoveAt(i)で固定列を除きお掃除する。

[ メッセージ編集済み 編集者: todo 編集日時 2005-09-13 20:32 ]

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