- PR -

DataGridへの結果表示

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

tetsuya11さんの書き込み (2004-03-08 18:58) より:

BindGridを呼び出すように変更しましたが、残念ながら状況は変わりません。


 で、メソッドの呼び出し順は、どのようだったのが、どのように変わりましたか?
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-09 15:55
***************************************************************************
Private Sub SearchBtn02_Click(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles SearchBtn02.Click

WhereSortRequest = "where life_staff like " & "'%" & _
    LifeStaffLst.SelectedItem.Text & "%'" & " and confi_time is null"
Session("PageNo") = 0
BindGrid("*", WhereSortRequest)

End Sub
***************************************************************************
に変更したところ

変更前に

PageLoadメソッドのPostBack⇒SearchBtn02_Clickメソッド
⇒PageLoadメソッドのNot PostBack

だったものが、変更後には

PageLoadメソッドのPostBack⇒SearchBtn02_Clickメソッド
⇒PageLoadメソッドのPostBack

に呼び出し順が変わりました。

tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-09 15:59
追記:

Page_Loadメソッドは以下のように変更しました。
**********************************************************************
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) 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
**********************************************************************


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

tetsuya11さんの書き込み (2004-03-09 15:55) より:

変更前に

PageLoadメソッドのPostBack⇒SearchBtn02_Clickメソッド
⇒PageLoadメソッドのNot PostBack

だったものが、変更後には

PageLoadメソッドのPostBack⇒SearchBtn02_Clickメソッド
⇒PageLoadメソッドのPostBack

に呼び出し順が変わりました。


 ??なぜPageLoadの呼び出しが2回?
 変更前は、Redirectしていたので、NotPostBackでPageLoadがコールされるのですが、変更後になぜ?JavaScriptか何か、一緒に出していますか?
 最初に掲示されたコードで、BindGridを呼び出している部分がありませんから、削除されているコードがあると判断します。掲載するために削除したコードで、何かしていませんか?


 この問は、

CLIENTの要求→SERVER:PageLoad(NotPostBack)→CLIENT表示
CLIENTでボタンクリック→SERVER:PageLoad(PostBack)→SERVER:イベント→CLIENT表示

となると予想される動作が、

CLIENTの要求→SERVER:PageLoad(NotPostBack)→CLIENT表示
CLIENTでボタンクリック→SERVER:PageLoad(PostBack)→SERVER:イベント→CLIENT表示→(何らかの要求)→SERVER:PageLoad(PostBack)→CLIENT表示

となっているため、「何らかの要求」を明らかにすることを目的としています。
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-09 16:21
引用:
--------------------------------------------------------------------------------

??なぜPageLoadの呼び出しが2回?
 変更前は、Redirectしていたので、NotPostBackでPageLoadがコールされるのですが、変更後になぜ?JavaScriptか何か、一緒に出していますか?
 最初に掲示されたコードで、BindGridを呼び出している部分がありませんから、削除されているコードがあると判断します。掲載するために削除したコードで、何かしていませんか?

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

すいません。再確認したところ、

変更後の呼び出し順は、Jittaさんのおっっしゃるとおり

PageLoadメソッドのPostBack⇒SearchBtn02_Clickメソッド

となってました。

コードの変更は掲示した以外はありませんでした。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-09 18:05
 う〜ん、プログラムでやっている処理を整理してみませんか?
 3/9 15:59投稿分には

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

と、DataBindメソッドのコールが入っていますが、これはなんでしょう?3/8 10:06投稿分にはないですよね?削っているところで何をやっているのか、そこで何かが発生しているような?

 1行ずつ「何をするか」を「日本語」で書き並べて、処理を整理してみませんか?


 それと、DataGridやページのViewStateは使用していますか?
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-09 19:14
引用:
--------------------------------------------------------------------------------
DataBindメソッドのコールが入っていますが、これはなんでしょう?3/8 10:06投稿分にはないですよね?削っているところで何をやっているのか、そこで何かが発生しているような?
--------------------------------------------------------------------------------
'DropDownList"LifeStaffLst"にstaff名をセットする為に必要だったんですが
必要なかったようです。

下記が処理を整理したものです。

SqlDataAdapter_Grid.Fill(DataSet_receipt) は、最初のPageLoad時に
DataGridへテーブル"joho"の全レコードを表示させる為だったのですが
無くても表示されたので削除しました。

あとは、DataGridをDataGrid2と記述ミスしていたのを修正しました。


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

Public Class ConnectCheckList
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()

'データの件数を" EntryDataCountlbl"に表示する
    If DataGrid.Items.Count = 0 Then
      EntryDataCountlbl.Text = "該当データがありません。"
    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

      'DropDownList"LifeStaffLst"にstaff名をセット
      SqlDataAdapter_staff.Fill(DataSet_staff)

'Session変数からデータの並び方を得る
WhereSortRequest = Session("WhereSortRequest")
      'WhereSortRequestが空の場合"Order by id desc"で全件表示 
      If WhereSortRequest = "" Then
        WhereSortRequest = "Order by id desc"
      End If

      BindGrid("*", WhereSortRequest)

End If

End Sub


Private Sub SearchBtn01_Click(ByVal sender As System.Object, ByVal _
e As System.EventArgs) Handles SearchBtn01.Click

    'DropDownList"LifeStaffLst"で選択したstaff名で抽出するSQL文作成
    WhereSortRequest = "where staff like " & "'%" & _
    StaffLst.SelectedItem.Text & "%'""
    Session("PageNo") = 0
    BindGrid("*", WhereSortRequest)

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

[ メッセージ編集済み 編集者: tetsuya11 編集日時 2004-03-09 19:20 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-09 21:06
 う〜ん?
 仕様は、

  • 初期表示は、全件表示する
  • ユーザはドロップダウンで絞り込み条件を選び、ボタンをクリックする
  • ボタンをクリックすると、絞り込み条件に一致するデータを表示する

ですよね。
 絞り込み条件ですが、「%入力%」となっていますが、「入力」が実は全件に共通して存在している、なんてことはないですよね?
 たとえば、
123-ABC-zxcv
ABC-GHT-asdf
678-QQQ-abcd
というデータで、「ABC」を絞り込み条件にしているとか。

 Page_Loadメソッド、SearchBtn01_Clickメソッド、BindGridメソッド、それぞれの入り口にブレークポイントをはって、デバッグ実行してください。
 すると、Page_Loadで止まって、If文の中に入ります。BindGridに移って、全件表示されます。
 次にポストバックが発生すると、Page_Loadで止まって、If文に入らず抜けます。そしてSearchBtn01_Clickで止まります。
 この中でBindGridに入る前後で、これへの引数の内容が一致しているか、確認してください。
 そういえば、PageNoをセッション変数に入れていますが、絞り込みを行うので、たとえば5ページ目を表示していて、絞り込み後に3ページしかなくなると、ここで例外が発生しますよ。
 ん?DataGridの選択とか、ページ遷移とかで、何かやっていませんか?それらにもブレークポイントをはって、それぞれで追いかけてみてください。詰まってしまうと視野が狭くなりますが、実は変更したところ以外のところで仕様外の動作が発生していることが、よくあります。

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