- PR -

DataSetのデータが消える?

1
投稿者投稿内容
Eins
会議室デビュー日: 2002/09/05
投稿数: 8
投稿日時: 2002-09-05 17:39
C#で開発を始めて間もない者ですがよろしくお願いします。

今DataSetを用いてDataGridにデータを表示することを
行っているのですが、その際DataBind後にDetaSet内のデータが参照出来ないと
いう状況が起こっているのですが、これが普通なのでしょうか?
もしくはどこかの設定によって起きているのでしょうか?

以下がそのときの状況のソースコードなのですが
[1]では値aが取得できるのですが、[2]ですとaの値が取れずに
エラーで「位置0に行がありません」というメッセージが出てしまいます。

どなたかお分かりの方、よろしくお願いします。

===============================================
private void Page_Load(object sender, System.EventArgs e)
{
if (! this.IsPostBack)
{
DataAdapter1.Fill(DataSet1);
DataGrid1.DataBind();

string a;
a = Convert.ToString(DataSet1.Tables[0].Rows[0][0]); ・・・[1]
}

private void Button1_Click(object sender, System.EventArgs e)
{
string a;
a = Convert.ToString(DataSet1.Tables[0].Rows[0][0]); ・・・[2]
}
----------------------------------------------------------------


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

Einsさんの書き込み (2002-09-05 17:39) より:
C#で開発を始めて間もない者ですがよろしくお願いします。

今DataSetを用いてDataGridにデータを表示することを
行っているのですが、その際DataBind後にDetaSet内のデータが参照出来ないと
いう状況が起こっているのですが、これが普通なのでしょうか?
もしくはどこかの設定によって起きているのでしょうか?

以下がそのときの状況のソースコードなのですが
[1]では値aが取得できるのですが、[2]ですとaの値が取れずに
エラーで「位置0に行がありません」というメッセージが出てしまいます。

どなたかお分かりの方、よろしくお願いします。

===============================================
コード:
private void Page_Load(object sender, System.EventArgs e)
{
   if (! this.IsPostBack) 
   {
     DataAdapter1.Fill(DataSet1);
     DataGrid1.DataBind();

     string a;
     a =	Convert.ToString(DataSet1.Tables[0].Rows[0][0]); ・・・[1]
   }

private void Button1_Click(object sender, System.EventArgs e)
{
   string a;
   a = Convert.ToString(DataSet1.Tables[0].Rows[0][0]); ・・・[2]
}


----------------------------------------------------------------






 そういう問題があることがわかっていたのでASP.NETはやめてWindowsコントロールで実現しました(^^;

 Page_LoadとButton1_Clickの実行される順番は確かめましたか?ここのどこかに書いてあったような・・・?


あと、ソースコードは大括弧でくくったcodeと/codeの間に埋めるといいみたいです。
Eins
会議室デビュー日: 2002/09/05
投稿数: 8
投稿日時: 2002-09-06 09:09
Jittaさん返信ありがとうございます。

ご指摘通り再度掲示板内の情報を見直してみたのですが
自分では見つかりませんでした。
(DataGridのカラム情報が消えるという内容が、微妙に関係あるような無いような
ですけれども)

あと、イベントの順番いついては
Page_Load → Button1_Clickなのをデバッグにて確かめたので
DataSet内に値がFillしてないということは無いようです。

それと、DataBind処理がデータを消してしまっている原因かと疑い、
この前のソースコードからDataBindしている行を消したのですが
同じく、Button_Clickイベント内でDataSetから値を取得することは出来ませんでした。

DataSetの内容が消えてしまうと、DataGridなどで編集した情報が
保持されないので、DataSetはデータを読み込んでDataGridに一覧表示すること
ぐらいしか出来ない気がするのですが、みなさんどのようにDataSetの情報を保持して
データの編集処理とかを行っているのでしょうか?

よろしくお願い致します。
かげん
会議室デビュー日: 2002/07/17
投稿数: 12
投稿日時: 2002-09-06 14:53
かげんです。
 デバッグで確認されたので間違いないのかも知れませんが
 再度以下をチェックされてはどうでしょうか?
 起動時からボタンをクリックした時に画面表示

 Page_Load <-- ! this.IsPostBack
| <-- ボタンクリック時
Page_Load
|
Button1_Click

上記で2回目のPage_Load は this.IsPostBackは実行
 されていないと思いますが、どうでしょうか?

 IsPostBack の外に DataBindをおかれて一度確認して
 みて下さい。
Eins
会議室デビュー日: 2002/09/05
投稿数: 8
投稿日時: 2002-09-06 17:37
引用:

かげんさんの書き込み (2002-09-06 14:53) より:
 Page_Load <-- ! this.IsPostBack
| <-- ボタンクリック時
Page_Load
|
Button1_Click
上記で2回目のPage_Load は this.IsPostBackは実行
 されていないと思いますが、どうでしょうか?
 IsPostBack の外に DataBindをおかれて一度確認して
 みて下さい。



上記の通りに試してみました。
記述どおりに
Page_Load !this.IsPostBack内

Page_Load !this.IsPostBack外
↓ボタン押す
Page_Load !this.IsPostBack外

Button1_Click

でした。

それで、その時に細かくDetaSet内の値をチェックしたのですが
結果、PostBackを行うとDataSet内の値がなくなるという結果なのですが
そういう仕様なのでしょうか?

↓結果とソースコード

↓起動
[1] 値あり
[2] 値あり
[3] 値あり
ボタン押す
[1] 通らない
[2] 値なし エラー「位置0に行がありません」
[3] 値あり ([2]をコメントアウトしてエラー回避した場合)
[4] 値あり (同上)


コード:
private void Page_Load(object sender, System.EventArgs e)
{
   if (! this.IsPostBack) 
   {
      DataAdapter.Fill(DataSet);
      DataGrid.DataBind();
      string a;
      a =Convert.ToString(DataSet.Tables[0].Rows[0][0]); // [1]
   }

   string b;
   b =Convert.ToString(DataSet.Tables[0].Rows[0][0]);  // [2]
   DataAdapter.Fill(DataSet);
   DataGrid1.DataBind();

   b =Convert.ToString(DataSet.Tables[0].Rows[0][0]);  // [3]
}

private void Button1_Click(object sender, System.EventArgs e)
{
   string a;
   a = Convert.ToString(DataSet.Tables[0].Rows[0][0]);  // [4]
}


かげん
会議室デビュー日: 2002/07/17
投稿数: 12
投稿日時: 2002-09-08 10:46
かげんです。
 .NETの仕様ではなく、Webアプリケーションの仕様だと
思います。

別の方法として、Sessionに保存してWebフォームで値を
引き継ぐ方法で試した事もありますがメモリー・パフォ
ーマンスなど考慮する必要がありますが・・

以前以下のように試した事があります。
If Not IsPostBaxk Then
初期処理
Else
変数A = CType(Session("変数B"), System.Data.DataTable)
End If

ページ終了時
Sessuib("変数B") = 変通A

Eins
会議室デビュー日: 2002/09/05
投稿数: 8
投稿日時: 2002-09-09 09:03
かげんさん、ありがとうございます。
やはり、Webの仕様ですか・・・
Webアプリ作成初めてですので、勉強になりました。

今は、やむをえずPostBackする前にデータ処理を行うようにしているのですが
Sessionないし他の方法で値の退避するのを試してみます。
ありがとうございました。
1

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