- PR -

DataGridのページングについて教えて下さい

1
投稿者投稿内容
1046
会議室デビュー日: 2006/01/03
投稿数: 9
投稿日時: 2006-03-11 14:51
ASP.NET(C#)で、ページングしたいのですが、
最初のページは、問題なく表示されるのですが、2ページ目で
『オブジェクト参照がオブジェクト インスタンスに設定されていません。 』
と表示されてしまいます。
原因は何でしょうか?
DBは、Access2000を使用しています。
ソースは以下のとおりです。

protected OleDbConnection cn;
protected OleDbDataAdapter da;
protected OleDbCommand cmd;
protected OleDbParameter Skey;
protected DataSet ds;

private void BTN_KENSAKU_Click(object sender, System.EventArgs e)
{
string S_Key;
if(textbox.Text=="" || textbox.Text==" ")
{
S_Key="%";
}
else if(textbox.Text.Length < 5)
{
S_Key=textbox.Text.Replace("*","%")+"%";
}
else
{
S_Key=textbox.Text;
}
cn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=(DBファイル名);");
da=new OleDbDataAdapter();
cmd = new OleDbCommand("SELECT * FROM DB WHERE CD LIKE @Skey",cn);
Skey=cmd.Parameters.Add("@Skey",SqlDbType.NText);
Skey.Value=S_Key;
da.SelectCommand =cmd;
ds=new DataSet();
da.Fill(ds,"Prd");
DataGrid1.DataSource=ds.Tables["Prd"];
DataGrid1.DataBind();

}

private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
DataGrid1.CurrentPageIndex=e.NewPageIndex;
da.Fill(ds,"Prd");
DataGrid1.DataSource=ds.Tables["Prd"];
DataGrid1.DataBind();
}

以上、ご教授宜しくお願い致します。
ue
ぬし
会議室デビュー日: 2005/05/07
投稿数: 581
お住まい・勤務地: 広島市
投稿日時: 2006-03-11 18:56
こんにちは。

da 等のデータの表示に必要なオブジェクトが DataGrid1_PageIndexChanged イベントハンドラ内でインスタンスとして生成されていないのが原因です。

[ メッセージ編集済み 編集者: ue 編集日時 2006-03-11 19:02 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-03-11 19:11
引用:

protected OleDbConnection cn;
protected OleDbDataAdapter da;
protected OleDbCommand cmd;
protected OleDbParameter Skey;
protected DataSet ds;


これらのスコープはこんなに広い必要がないと思うので、もう少し狭くしてみてはどうでしょうか。そうしたらあまり悩まなくて済むと思います。
#ds は場合によっては広くてもいいかも
_________________
囚人のジレンマな日々
1046
会議室デビュー日: 2006/01/03
投稿数: 9
投稿日時: 2006-03-12 05:34
引用:

ueさんの書き込み (2006-03-11 18:56) より:
こんにちは。

da 等のデータの表示に必要なオブジェクトが DataGrid1_PageIndexChanged イベントハンドラ内でインスタンスとして生成されていないのが原因です。

[ メッセージ編集済み 編集者: ue 編集日時 2006-03-11 19:02 ]



Data_PageIndexChangedイベントハンドラ内で、da等を生成してみたのですが、
変わらなかったです。
ASP.NETの勉強を始めて数ヶ月したたっていないので、詳しい事があまりわかって
いませんので、申し訳有りませんが、もうちょっと舞台的に教えて頂けると幸いです。

お手数お掛けしますが、宜しくお願い申し上げます。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-03-12 07:02
[検索]ボタンをクリックしたときの動作とDataGridのページングの動作
を見直してみてください。以下のように書き換えると動作するかと。


コード:
private void BTN_KENSAKU_Click(object sender, System.EventArgs e) 
{
BindGrid(); 
} 

private void DataGrid1_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e) 
{ 
DataGrid1.CurrentPageIndex=e.NewPageIndex; 
BindGrid();
} 

private void BindGrid()
{
OleDbConnection cn; 
OleDbDataAdapter da; 
OleDbCommand cmd; 
OleDbParameter Skey; 
DataSet ds;
string S_Key; 

if(textbox.Text=="" || textbox.Text==" ") 
{ 
S_Key="%"; 
} 
else if(textbox.Text.Length < 5) 
{ 
S_Key=textbox.Text.Replace("*","%")+"%"; 
} 
else 
{ 
S_Key=textbox.Text; 
} 
cn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=(DBファイル名);"); 
da=new OleDbDataAdapter(); 
cmd = new OleDbCommand("SELECT * FROM DB WHERE CD LIKE @Skey",cn); 
Skey=cmd.Parameters.Add("@Skey",SqlDbType.NText); 
Skey.Value=S_Key; 
da.SelectCommand =cmd; 
ds=new DataSet(); 
da.Fill(ds,"Prd"); 
DataGrid1.DataSource=ds.Tables["Prd"]; 
DataGrid1.DataBind(); 
}


_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集
1046
会議室デビュー日: 2006/01/03
投稿数: 9
投稿日時: 2006-03-12 09:02
ACCESSさん、ありがとう御座いました。

ACCESSさんの修正して頂いた通りに直したら、
無事にページングが機能するようになりました。

だけど・・・
DataGrid1_PageIndexChangedイベント内でも
再度、da等を生成しないとダメなのは、なぜでしょうか。
理由がイマイチわかりません。

引き続きご教授お願い申し上げます。
Kazuki
ぬし
会議室デビュー日: 2004/10/13
投稿数: 298
投稿日時: 2006-03-12 12:42
http://www.atmarkit.co.jp/fdotnet/entwebapp/entwebapp05/entwebapp05_01.html
ここらへん参考になると思います。
1

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