- PR -

DataGridへの結果表示

投稿者投稿内容
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-08 10:06
お世話になっております。
初歩的な質問となるかのしれませんが
初心者なので宜しくお願いします。

SQLSever2000を使用し、テーブル"joho"のレコードを
DataGridに一覧表示させ、DropDownListで選択した条件で
検索した結果の件数と抽出したレコードを再表示させようと
しているのですが、件数の結果は出るのですが、抽出した
レコードは再表示されず、最初にPageLoadした時のまま(全件表示)
です。
DataSetには抽出結果は入っているのですが。。。

ソースは下記のとおりです。

ご教授願いますよう宜しくお願いいたします。

**index.aspx***************

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

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)
Dim SQL As String = "select " & ExtractRequest & " from " & _
TableName0 & " " & SortRequest

sql_c(SQL)

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) & ")")

DataGrid2.CurrentPageIndex = Session("PageNo")
DataGrid2.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
   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


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

Session("WhereSortRequest") = _
"where life_staff like " & "'%" & StaffLst.SelectedItem.Text & "%'""
Session("PageNo") = 0
Response.Redirect("index.aspx")

End Sub

End Class

****************************************
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-08 10:16
すいません。
下記のSession変数をGlobal.asaxに設定してあることを
記述してませんでした。

宜しくお願いします。

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

  Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
Dim PageIndexNum As Integer
Session("PageNo") = PageIndexNum
Dim WhereSortRequest As String
Session("WhereSortRequest") = WhereSortRequest
End Sub

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

tetsuya11さんの書き込み (2004-03-08 10:06) より:
お世話になっております。
初歩的な質問となるかのしれませんが
初心者なので宜しくお願いします。

SQLSever2000を使用し、テーブル"joho"のレコードを
DataGridに一覧表示させ、DropDownListで選択した条件で
検索した結果の件数と抽出したレコードを再表示させようと
しているのですが、件数の結果は出るのですが、抽出した
レコードは再表示されず、最初にPageLoadした時のまま(全件表示)
です。
DataSetには抽出結果は入っているのですが。。。


 「初心者です」という言葉と、ソースの引用を組み合わせると、「私の仕事をあなたがやってください」と取られることがあるのでご注意。「初心者」と書くより、経験年数(月数)など、具体的な記述をしていただければ、どれくらい砕いて説明しなければならないかが、よく伝わります。「初心者」と書くことで、本当は初心ではないのに、懇切丁寧な説明を要求する輩もいますので、そういうのと区別してもらうためにも、気を付けてください。


 それで、まずは考え方から、、、Webアプリケーションでは、クライアントにデータが戻されるごとにインスタンスがいったん破棄されます。したがって、クラス変数にせっかく取得値をセーブしたつもりでも、それらは消えてしまいます。セッション変数やアプリケーション変数など、永続化されるところに保存しないのであれば、ページロードごとに毎回取得しなければなりません。そうでなければ、ビューステートのものが表示されます。

 まず、そこのところをなおしてみてください。


 あと、Adapter.Fillに使うのであれば、SqlConnectionをOpen/Closeする必要はありません。Fillの内部で勝手にやってくれます。
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-08 14:40
経験は3ヶ月です

質問内容に説明不足な部分があったようなので
補足させていただきます。

最初にPageLoadした時にテーブルのレコードをDataGridに
全件表示させます。
そして、条件を指定して、その結果をDataGridに表示させようと
しています。

抽出結果は

------------------------------------------------------------------------
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) & ")")
-------------------------------------------------------------------------

で、デバックには、条件に合った期待どおりの結果が表示され、

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

で、抽出されたレコードの件数もカウントしているます。
しかし、DataBindにはデータが入っていない為か、
DataGridには抽出したレコードのデータではなく、
最初にPageLoadした時と同じ全件が表示されたままです。

なぜ、DataGridに抽出したレコードが表示されないのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-08 16:35
引用:

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

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

Session("WhereSortRequest") = _
"where life_staff like " & "'%" & StaffLst.SelectedItem.Text & "%'""
Session("PageNo") = 0
Response.Redirect("index.aspx")

End Sub


 このメソッドがすごく気になったのですが、このメソッドはいつ実行されるのでしょう?また、リダイレクト先の「index.aspx」とは、どういうページですか?

 ・・・?なんか、根本的に動作を誤解しているような?
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-08 17:05
引用:
--------------------------------------------------------------------------------

このメソッドがすごく気になったのですが、このメソッドはいつ実行されるのでしょう?また、リダイレクト先の「index.aspx」とは、どういうページですか?

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

「index.aspx」には、

・DropDownList"StaffLst"
・DataGrid
・Button"SearchBtn01"
・Label"EntryDataCountlbl"

があります。

「index.aspx」をロードし、テーブル"joho"のレコードの全件を
DataGridにさせ、DropDownList"StaffLst"で条件を選択し、
Button"SearchBtn01"をクリックすると

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

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

Session("WhereSortRequest") = _
"where life_staff like " & "'%" & StaffLst.SelectedItem.Text & "%'""
Session("PageNo") = 0
Response.Redirect("index.aspx")

End Sub

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

が実行され、「index.aspx」に検索した結果の件数をLabel"EntryDataCountlbl"へ、
そして抽出したレコードをDataGridに表示させようとしています。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-03-08 17:40
 今のプログラムで、全てのメソッドの先頭にブレークポイントを置いて、どのような順番でメソッドが実行されるか、書き留めてみてください。また、その時々にIsPostBackがどのような値になっているかも、書き留めてみてください。それで期待通りの動作をしない理由がわかると思います。

 Response.Redirectを実行すると、その時点でサーバのスレッドは停止し、クライアントにリダイレクト先のURLを引き渡します。クライアントはリダイレクトするという指示を受けとり、サーバへリダイレクト先のURLを要求します。これによって、Page_Loadメソッドがどのように処理されるか、わかりますか?





 Response.RedirectをBindGridの呼び出しに変更すれば、ご希望通りの動作になると思います。
tetsuya11
常連さん
会議室デビュー日: 2003/11/08
投稿数: 37
投稿日時: 2004-03-08 18:58
BindGridを呼び出すように変更しましたが、残念ながら状況は変わりません。

DataGrid2.DataBind() でバインドされてきません。
今回はDataGrid2.Items.Count が0になってしまいます。
直前のデータセットの中身を表示するとデータの抽出はできているのですが。

※最初の投稿時のソースのDataGridとDataGrid2は同一のものです。
すいません記述ミスです。

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