- PR -

DataGridへの結果表示

投稿者投稿内容
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-10 12:09
引用:
---------------------------------------------------------------------
仕様は、
・初期表示は、全件表示する
・ユーザはドロップダウンで絞り込み条件を選び、ボタンをクリックする
・ボタンをクリックすると、絞り込み条件に一致するデータを表示する
ですよね。
---------------------------------------------------------------------

はい、そうです。


引用:
---------------------------------------------------------------------
絞り込み条件ですが、「%入力%」となっていますが、「入力」が実は全件に
共通して存在している、なんてことはないですよね?
---------------------------------------------------------------------

個人名なので全件に共通はしていません。

デバックしてみましたが、ポストバックが発生後、Page_Loadで止まって、
If文に入らず抜け、SearchBtn01_Clickで止まり、
'DropDownList"LifeStaffLst"で選択したstaff名で絞り込み条件のSQL文が作成され
BindGridメソッドに入る前後での引数の内容も一致しています。(自動変数ウィンド
ウで確認)。
そして、BindGridメソッドの
「DataGrid2.DataSource = ds.Tables(TableName0).DefaultView 」の次に

********************************************************

'データセット内のレコードデータをデバッグに表示
  System.Diagnostics.Debug.WriteLine("--1行目1列目(" & ds.Tables _
  (TableName0).Rows(0).Item(0) & "), 2列目(" & ds.Tables(TableName0).Rows(0).Item(1) & ")")
  System.Diagnostics.Debug.WriteLine("--2行目1列目(" & ds.Tables _
(TableName0).Rows(1).Item(0) & "), 2列目(" & ds.Tables(TableName0).Rows(1).Item(1) & ")")
********************************************************

を追加し、"出力ウィンドウ"に期待通りの結果が表示されていました。
あとは下記のソースがあるくらいで、ブレークポイントをはってみましたが
通ることはありませんでした。

**********************************************************************
Private Sub DataGrid2_PageIndexChanged(ByVal source As Object, ByVal _
e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles _
DataGrid2.PageIndexChanged

'Session変数にDataGridのページを収めてリダイレクトをかける
Session("PageNo") = e.NewPageIndex
Response.Redirect("ConnectCheckList.aspx")

End Sub
**********************************************************************


追記:
【投稿日時: 2004-03-09 19:14】でPage_Loadメソッドを変更しましたが
今日テストしてみたら、'DropDownList"LifeStaffLst"とDataGridに
何故かデータがセットされなかったので下記のように修正しました。

***********************************************************************
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load

If Not IsPostBack Then
'データベースに接続し、DataSetオブジェクトにテーブルを受け渡す
SqlDataAdapter_Grid.Fill(DataSet_receipt)
SqlDataAdapter_staff.Fill(DataSet_staff)

DataBind()

'Session変数からデータの並び方を得る
WhereSortRequest = Session("WhereSortRequest")
If WhereSortRequest = "" Then
WhereSortRequest = "Order by receipt_id desc"

End If
BindGrid("*", WhereSortRequest)
End If

End Sub
***********************************************************************
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-10 13:17
 最初のもそうでしたが、『Response.Redirect(URI)』の記述が非常に気になるのですが、、、なんというか、どういう意図でこれ(Response.Redirect)を使っていますか?

 先に示した「仕様」を満足するのに、リダイレクトさせる必要はなく、むしろ余計なのですが。。。なんだか、これ(いたる所に仕込まれているように思えるResponse.Redirect)がじゃましているように思います。


 例えば、「2004-03-10 12:09」でご提示のぶんではDataGrid2.PageIndexChangedの中にありますよね。すると、「index」ページにあるDataGridのページを変更すると、「ConnectCheckList」ページが表示されるわけですよね。これは、ユーザビリティを考えると、とても不自然ではないでしょうか。DataGridのページ変更が行われはしても、他のページを表示するような動作を、ユーザは期待していないと思います。

 または、このページでは実際にはユーザに見えるようなことは何もしておらず、名前から想像されるように何らかの「接続」の「チェックリスト」を作り、それをセッション変数にしまって、「index」ページへリダイレクトさせているのだとしたら、それもおかしな話です。サーバ内で完結させなければならない処理を、Response.Redirectを使うことによってクライアントを介在して行っているのですから。



 そういう、サーバ/クライアント間の通処理も含めて、整理しないと、この問題がクリアできたとしても、いずれ破綻すると思います。
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-10 13:31
たびたび申し訳ありません。
「ConnectCheckList」は誤記で「index.aspx」が正しいです。

**********************************************************************
Private Sub DataGrid_PageIndexChanged(ByVal source As Object, ByVal _
e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles _
DataGrid.PageIndexChanged

'Session変数にDataGridのページを収めてリダイレクトをかける
Session("PageNo") = e.NewPageIndex
Response.Redirect("index.aspx")

End Sub
**********************************************************************
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-10 15:12
引用:

Jittaの書き込み (2004-03-10 13:17) より:
 最初のもそうでしたが、『Response.Redirect(URI)』の記述が非常に気になるのですが、、、なんというか、どういう意図でこれ(Response.Redirect)を使っていますか?

 先に示した「仕様」を満足するのに、リダイレクトさせる必要はなく、むしろ余計なのですが。。。なんだか、これ(いたる所に仕込まれているように思えるResponse.Redirect)がじゃましているように思います。

サーバ/クライアント間の通処理も含めて、整理しないと、この問題がクリアできたとしても、いずれ破綻すると思います。


 メインはこれだったんですけど。。。

 どのようなデバッグ作業を行いましたか?私なら、全てのセッション変数に値を設定しているところにブレークを張って、1つの操作中に消したりしているところがないか、調べます。
 あと、デバッグ文ではOkということなので、その後で再バインドするような処理が無いか探したり。


 それと、この書式ですけど・・・
Class HogeHoge
 Private ABC As New CLASS_NAME

この変数に割り当てられたメモリって、どこまで有効でしたっけ?
 私の方で、DefaultDataViewを複数の箇所で取ったが為に発生した不具合があったのですが、DataViewをNewしてやればいけるような、それともDataSetをNewするところを変更すればいけるような???でも、この使い方なら、データセットを作らなくても、データテーブルだけで足りそう。。。Fillの引数にはDataTableもいけます。
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-10 19:32

引用:
--------------------------------------------------------------------------------
どのようなデバッグ作業を行いましたか?私なら、全てのセッション変数に値を設定しているところにブレークを張って、1つの操作中に消したりしているところがないか、調べます。
 あと、デバッグ文ではOkということなので、その後で再バインドするような処理が無いか探したり。
--------------------------------------------------------------------------------
そのようにしてデバック作業は行いました。
デバッグで、BindGridメソッドの全てのコードにブレークポイントを張って
自動変数ウィンドウで確認してみたところ、BindGridメソッドだけで処理が終わり、
再バインドはされず、index.aspxが表示され、「該当データがありません」と表示
されDataGridには何も表示されません。


引用:
--------------------------------------------------------------------------------
それと、この書式ですけど・・・
Class HogeHoge
 Private ABC As New CLASS_NAME

この変数に割り当てられたメモリって、どこまで有効でしたっけ?
------------------------------------------------------------------------------
生成されたオブジェクトが、プログラムコードか内から全く参照されなくなると
.NET Frameworkのガベレージコレクタに解放されます。この解放はプログラム
コードで命令することもできるようです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-11 11:19
 納得がいかないところが、いくつかあるのですが、、、

1.「2004-03-08 10:06」のソースを、インデントを整理してみました。
コード:
Private Sub Page_Load(略) Handles MyBase.Load 
	If Not IsPostBack Then 
		SqlConnection_receipt.Open() 
		SqlDataAdapter_Grid.Fill(DataSet_receipt) 
		SqlDataAdapter_staff.Fill(DataSet_staff) 
		SqlConnection_receipt.Close() 

		WhereSortRequest = Session("WhereSortRequest") 
		If WhereSortRequest = "" Then 
			WhereSortRequest = "Order by id desc" 
		End If 
	End If 
End Sub 


  このコードで、『最初にPageLoadした時にテーブルのレコードを
 DataGridに全件表示させます。』(「2004-03-08 14:40」より)と
 ありますが、本当にグリッドに全件表示されていましたか?グリッ
 ドにDataSourceを設定するところも、バインドするところもないの
 ですが。

※ おそらく、編集して転記されていると思いますが、転記していな
 いところに原因があるように思えて仕方がありません。


2.「2004-03-08 17:40」の私のポストで、Page_Loadと
 SearchBtn01_Clickを修正されました。
コード:
Private Sub Page_Load(略) Handles MyBase.Load 
	If Not IsPostBack Then 
		SqlDataAdapter_Grid.Fill(DataSet_receipt) 
		SqlDataAdapter_staff.Fill(DataSet_staff) 
		DataBind() 
		WhereSortRequest = Session("WhereSortRequest") 
		If WhereSortRequest = "" Then 
			WhereSortRequest = "Order by receipt_id desc" 
		End If 
		BindGrid("*", WhereSortRequest) 
	End If 
End Sub

Private Sub SearchBtn02_Click(略) Handles SearchBtn02.Click 
	WhereSortRequest = "where life_staff like " & "'%" & _ 
		LifeStaffLst.SelectedItem.Text & "%'" & _
		" and confi_time is null" 
	Session("PageNo") = 0 
	BindGrid("*", WhereSortRequest)


 まずPage_Loadの方ですが、最初のと比べて、DataBindメソッドの
 呼び出しが追加されています。これは「2004-03-09 19:14」に
 『'DropDownList"LifeStaffLst"にstaff名をセットする為に必要』
 とおっしゃっているにもかかわらず、「2004-03-10 12:09」の追
 記で『'DropDownList"LifeStaffLst"とDataGridに何故かデータが
 セットされなかったので下記のように修正』と、また追加されて
 います。ここで、【なぜか】を、なぜ放って置かれているので
 しょう?なぜ表示されなかったか、追求してください。

※ ここから1つ考えられるのが、クライアントのIEの「ページ
 キャッシュ」が、「確認しない」になっていませんか?この設定
 で、おっしゃるような現象が出ていたクライアントがありました。
 「ページを表示するごとに確認する」に変えてください。


3.抽出条件が「life_staff like '%入力%'」から、
 「life_staff like '%入力%' and confi_time is null」に変更さ
 れています。
  「2004-03-09 19:14」で提示されているソースではさらに変わっ
 ていて、「staff like '%入力%'」となっています。

※ この条件変更によって、抽出される件数が0になっていませんか?



 DataTableのDefaultViewを使用されていますが、ビューの使用方法が間違っていませんか?
 例えば、次のようなコーディングもできるのです。
コード:
Public Class ConnectCheckList 
	Inherits System.Web.UI.Page

	Private Shared ds As DataSet = New DataSet("SharedDataSet")

	Private Sub Page_Load(略...
		If Not IsPostBack Then
			' 最初に全件を取得するコードをここに書く
			BindDataToGrid()
		End If
	End Sub

	Private Sub BindDataToGrid(Optional Filter As String = "")
		' データセットをアプリケーションレベルで共有するので、
		' DefaultViewは全ての要求で1つになってしまう。
		' 要求ごとに分離するため、毎回ViewをNewする
		Dim dv As New DataView(ds.Tables(TableName0))

		dv.RowFilter = Filter
		dv.Sort = "id desc"

		' ビューの変更で選択がおかしくなったり、
		' ページが無くなると例外が発生するので、
		' 変更前にクリアしておく
		DataGrid2.SelectedIndex = -1
		DataGrid2.CurrentPageIndex = 0
		DataGrid2.DataSource = dv
		DataGrid2.DataBind()
	End Sub

	Private Sub SearchBtn01_Click(略...
		BindDataToGrid(String.Format( _
			"life_staff like '*{0}*'" _
			, StaffLst.SelectedItem.Text))
	End Sub


tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-11 12:56
引用:
--------------------------------------------------------------------
※ おそらく、編集して転記されていると思いますが、転記していな
 いところに原因があるように思えて仕方がありません。
--------------------------------------------------------------------
多少編集して転記はしていましたが、コード自体を変更したりもしていたので
投稿ごとに誤記があったようです。
すいません。。。。

引用:
-------------------------------------------------------------------
 「ページを表示するごとに確認する」に変えてください。
-------------------------------------------------------------------
確認したところ、「自動確認」になっていたのですが、
変更しました。

今現在使用しているコードをそのまま転記します。
DataGridのEnableViewStateはTrueになってます。
条件検索後にDataSetには期待通りの結果が入っているのに
DataGridにその結果が表示されず、あとの動作は問題ありません。
DataGridのページングも問題なくできています。

index.aspx.vb
***********************************************************************
Imports System.Data
Imports System.Data.SqlClient

Public Class index
Inherits System.Web.UI.Page

Dim SQLConnStr As String = "*********************"

Dim MyConnection As New SqlConnection(SQLConnStr)

'データベースのテーブル名の初期化と設定
Dim TableName0 As String = "joho"

'データセットを作成
Dim ds As DataSet = New DataSet

'データの並び方を設定する文字列の初期化
Dim WhereSortRequest As String


'DB接続インスタンスを利用して、DBの対象データとデータセットdsとの同期を行う、
'DataAdapterクラスのインスタンスを作成
'SQL文の結果テーブルを、データセットdsにTableName名でデータを入れる
Private Function sql_c(ByVal SQL As String)
Dim MyCommand As New SqlDataAdapter(SQL, MyConnection)
MyCommand.Fill(ds, TableName0)
End Function

Private Function BindGrid(ByVal ExtractRequest As String, ByVal _
SortRequest As String)
'参照用のSQL文を作成し、sql_cメソッドを実行する
Dim SQL As String = "select " & ExtractRequest & " from " & _
TableName0 & " " & SortRequest

sql_c(SQL)

DataGrid.DataSource = ds.Tables(TableName0).DefaultView
System.Diagnostics.Debug.WriteLine("--1行目1列目(" & _
ds.Tables(TableName0).Rows(0).Item(0) & "), 2列目(" & _
ds.Tables(TableName0).Rows(0).Item(1) & ")")
System.Diagnostics.Debug.WriteLine("--2行目1列目(" & _
ds.Tables(TableName0).Rows(1).Item(0) & "), 2列目(" & _
ds.Tables(TableName0).Rows(1).Item(1) & ")")
DataGrid.CurrentPageIndex = Session("PageNo")
DataGrid.DataBind()

'データの件数を表示する
If DataGrid.Items.Count = 0 Then
EntryDataCountlbl.Text = "該当データがありません。"
'DataGrid.Visible = False
Else
EntryDataCountlbl.Text = ds.Tables(TableName0).DefaultView.Count _
().ToString & "件の要件があります。"
End If
End Function

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not IsPostBack Then
'データベースに接続し、DataSetオブジェクトにテーブルを受け渡す
      'DataGridに全件表示する為に使用 
SqlDataAdapter_Grid.Fill(DataSet_receipt)
      '"LifeStaffLst"にセットする為に使用
SqlDataAdapter_staff.Fill(DataSet_staff)
DataBind()

'Session変数からデータの並び方を得る
WhereSortRequest = Session("WhereSortRequest")
If WhereSortRequest = "" Then
        '主キー"receipt_id"(オートナンバー)で降順にソート
WhereSortRequest = "Order by receipt_id desc"
End If
BindGrid("*", WhereSortRequest)
End If
End Sub

Private Sub DataGrid_PageIndexChanged(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridPageChangedEventArgs) Handles DataGrid.PageIndexChanged
'Session変数にDataGridのページを収めてリダイレクトをかける
Session("PageNo") = e.NewPageIndex
Response.Redirect("index.aspx")
End Sub

Private Sub SearchBtn01_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SearchBtn01.Click
   'DropDownList"LifeStaffLst"で選択したstaff名で抽出するSQL文作成
'"confi_time"はDatetime型
WhereSortRequest = "where life_staff like " & "'%" & _
LifeStaffLst.SelectedItem.Text & "%'" & " and confi_time is null"
Session("PageNo") = 0
BindGrid("*", WhereSortRequest)
End Sub
End Class
***********************************************************************

Global.asax.vb

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
'Session変数を設定する
Dim PageIndexNum As Integer
Session("PageNo") = PageIndexNum
Dim WhereSortRequest As String
Session("WhereSortRequest") = WhereSortRequest
End Sub
***********************************************************************

引用:
-----------------------------------------------------------------------
 DataTableのDefaultViewを使用されていますが、ビューの使用方法が
 間違っていませんか?
 例えば、次のようなコーディングもできるのです。
-----------------------------------------------------------------------
参考にさせていただいてテストしてみます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-11 16:15
引用:

tetsuya11さんの書き込み (2004-03-11 12:56) より:

コード:
Private Function BindGrid(ByVal ExtractRequest As String, ByVal _
SortRequest As String)
(略)
        DataGrid.DataSource = ds.Tables(TableName0).DefaultView
        DataGrid.CurrentPageIndex = Session("PageNo")
        DataGrid.DataBind()
(略)        
End Function




 ここのCurrentPageIndexを設定しているところですが、なんか、ひっかかる。このメソッドをコールしたメソッドを抜けた後に、DataGrid_PageIndexChangedメソッドが実行されたりしていませんか?

 Webアプリケーションのイベントは、設定されているデータとPostBackデータが違っていれば発生します。ここでページの再設定が行われ、イベントハンドラでリダイレクトが実行されると…例えばページを1ページ目以外を表示していてボタンをクリックすると、絞り込んで検索された後、リダイレクトでまたBindGridが呼ばれ、このときには全件検索になると思います(このコードでは)。

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