- - PR -
DataGridへの結果表示
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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 *********************************************************************** | ||||||||||||
|
投稿日時: 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を使うことによってクライアントを介在して行っているのですから。 そういう、サーバ/クライアント間の通処理も含めて、整理しないと、この問題がクリアできたとしても、いずれ破綻すると思います。 | ||||||||||||
|
投稿日時: 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 ********************************************************************** | ||||||||||||
|
投稿日時: 2004-03-10 15:12
メインはこれだったんですけど。。。 どのようなデバッグ作業を行いましたか?私なら、全てのセッション変数に値を設定しているところにブレークを張って、1つの操作中に消したりしているところがないか、調べます。 あと、デバッグ文ではOkということなので、その後で再バインドするような処理が無いか探したり。 それと、この書式ですけど・・・ Class HogeHoge Private ABC As New CLASS_NAME この変数に割り当てられたメモリって、どこまで有効でしたっけ? 私の方で、DefaultDataViewを複数の箇所で取ったが為に発生した不具合があったのですが、DataViewをNewしてやればいけるような、それともDataSetをNewするところを変更すればいけるような???でも、この使い方なら、データセットを作らなくても、データテーブルだけで足りそう。。。Fillの引数にはDataTableもいけます。 | ||||||||||||
|
投稿日時: 2004-03-10 19:32
引用: -------------------------------------------------------------------------------- どのようなデバッグ作業を行いましたか?私なら、全てのセッション変数に値を設定しているところにブレークを張って、1つの操作中に消したりしているところがないか、調べます。 あと、デバッグ文ではOkということなので、その後で再バインドするような処理が無いか探したり。 -------------------------------------------------------------------------------- そのようにしてデバック作業は行いました。 デバッグで、BindGridメソッドの全てのコードにブレークポイントを張って 自動変数ウィンドウで確認してみたところ、BindGridメソッドだけで処理が終わり、 再バインドはされず、index.aspxが表示され、「該当データがありません」と表示 されDataGridには何も表示されません。 引用: -------------------------------------------------------------------------------- それと、この書式ですけど・・・ Class HogeHoge Private ABC As New CLASS_NAME この変数に割り当てられたメモリって、どこまで有効でしたっけ? ------------------------------------------------------------------------------ 生成されたオブジェクトが、プログラムコードか内から全く参照されなくなると .NET Frameworkのガベレージコレクタに解放されます。この解放はプログラム コードで命令することもできるようです。 | ||||||||||||
|
投稿日時: 2004-03-11 11:19
納得がいかないところが、いくつかあるのですが、、、
1.「2004-03-08 10:06」のソースを、インデントを整理してみました。
このコードで、『最初にPageLoadした時にテーブルのレコードを DataGridに全件表示させます。』(「2004-03-08 14:40」より)と ありますが、本当にグリッドに全件表示されていましたか?グリッ ドにDataSourceを設定するところも、バインドするところもないの ですが。 ※ おそらく、編集して転記されていると思いますが、転記していな いところに原因があるように思えて仕方がありません。 2.「2004-03-08 17:40」の私のポストで、Page_Loadと SearchBtn01_Clickを修正されました。
まず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を使用されていますが、ビューの使用方法が間違っていませんか? 例えば、次のようなコーディングもできるのです。
| ||||||||||||
|
投稿日時: 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を使用されていますが、ビューの使用方法が 間違っていませんか? 例えば、次のようなコーディングもできるのです。 ----------------------------------------------------------------------- 参考にさせていただいてテストしてみます。 | ||||||||||||
|
投稿日時: 2004-03-11 16:15
ここのCurrentPageIndexを設定しているところですが、なんか、ひっかかる。このメソッドをコールしたメソッドを抜けた後に、DataGrid_PageIndexChangedメソッドが実行されたりしていませんか? Webアプリケーションのイベントは、設定されているデータとPostBackデータが違っていれば発生します。ここでページの再設定が行われ、イベントハンドラでリダイレクトが実行されると…例えばページを1ページ目以外を表示していてボタンをクリックすると、絞り込んで検索された後、リダイレクトでまたBindGridが呼ばれ、このときには全件検索になると思います(このコードでは)。 |