- PR -

動的なDataGrid

投稿者投稿内容
es
常連さん
会議室デビュー日: 2003/08/18
投稿数: 20
投稿日時: 2003-08-25 23:02
Jittaさんありがとうございます。
listbox.item(i).selectedをFor文で回すことで確認できました。お陰様でカラムの選択で表示する事はできました。本当にありがとうございます。

でも、一つ気になってるんですが、自動生成したDataGridに自分で作成したSQL文を反映させるにはどうしたらいいんですか?実は当初の予定ではこれでやりたかったんですど、自動生成のSelectCommandを変更するのってできるのだろうか?って思ってたんです。過去のレスを見たんですけど、勉強不足で書いてあることがよく解らない時がおおいんですよね。

毎回毎回、聞いてすいません。

[ メッセージ編集済み 編集者: es 編集日時 2003-08-25 23:27 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-26 09:00
 ちょっと意味がわかりにくいのですが・・・

 選択されたらすぐにDataGridに反映でしたよね?ListBoxのSelectIndexChangedイベントハンドラで、SQL文を作成し、DataTableへDataAdapter経由でFill()します(DataAdapter.Dispose()を忘れずに)。できたDataTableをDataGrid.DataSourceに(DataSetでないとダメだった?)参照させ、DataGrid.DataBind()をコールすると、内容が変わります。
es
常連さん
会議室デビュー日: 2003/08/18
投稿数: 20
投稿日時: 2003-08-27 22:47
いつもお世話になってます。

仕様変更になりまして、ASP.NET(VB)で先のページで、以前言っていリストからテーブル、次にカラムを選択して、SQLを作成しまして次のページへそのSELECT文を渡す事になりました。
SELECT文を受け取った側(ページ)でDataGridに表示するのですが、DataTableへDataAdapter経由でFill()をするっていうのは、DataAdapter.Fill(DataSet)とは違うのでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-28 09:13
 別ページにすると、できたSQL文を渡すのが面倒ですよ。まぁ、方法はちらほら出てきていますが。

未検証〜〜〜〜〜〜〜〜〜〜

private withevents listbox1 as System.Web.UI.WebControls.ListBox
private withevents listbox2 as System.Web.UI.WebControls.ListBox
private withevents button1 as System.Web.UI.WebControls.Button
private withevents datagrid1 as System.Web.UI.WebControls.DataGrid

' listbox1には、表の一覧が表示されている
' listbox1で1つ選択すると、listbox2に、その表の列名一覧が表示される
' listbox2は複数選択可能
' button1をクリックすると、listbox1で選択した表の、
' listbox2で選択した列を取得する列を取得するSELECT文を作成する
' datagrid1に、作成したSELECT文の実行結果を表示する

Private Sub Page_Load(...) Handles MyBase.Load
listbox1.selectionmode = single
listbox2.selectionmode = multiple
end sub

private sub listbox1_selectedindexchanged(...) handles listbox1.selectedindexchanged
dim sql as string = string.format("SELECT * FROM {0}", listbox1.selecteditem.text)
dim tbl as new datatable
dim adpt as new oledb.oledbdataadapter(sql, ConnectionString)
try
adpt.fillschema(tbl) ' テーブル構成だけ集める

listbox2.items.clear()
dim i as integer
for i = 0 to tbl.columns.count - 1
listbox2.items.add(tbl.columns(i).columnname)
next

finally
adpt.dispose()
tbl.dispose()
end try
end sub

private sub button1_click(...) handles button1.click
if listbox2.selectedindex < 0 then return

dim cols as string = ""
dim i as integer

for i = 0 to listbox2.items.count - 1
if listbox2.items(i).selected then
cols &= (", " & listbox2.items(i).text)
end if
next
cols = cols.substring(2) ' 先頭に余分に", "があるので取る

dim sql as string = "SELECT " & cols & " FROM " & listbox1.selecteditem.text
DoSelect(sql)
end sub

private sub DoSelect(sql as string)
dim dset as new dataset
dim adpt as new oledb.oledbdataadapter(sql, ConnectionString)

try
adpt.fill(dset)
datagrid1.datasource = dset
datagrid1.datamember = dset.tables(0).tablename
datagrid1.bind()

finally
adpt.dispose()
dset.dispose()
end try
end sub
Micky
大ベテラン
会議室デビュー日: 2002/09/04
投稿数: 137
投稿日時: 2003-08-28 09:34
Mickyでございます。
いつも勉強させていただいております。

引用:
--------------------------------------------------------------------------------

esさんの書き込み (2003-08-27 22:47) より:
DataTableへDataAdapter経由でFill()をするっていうのは、DataAdapter.Fill(DataSet)とは違うのでしょうか?
--------------------------------------------------------------------------------

的を外していたらゴメンナサイ
DataSetは仮想のデータベースと理解しています。

DataSet:データベース
DataTable:データベースに含まれるテーブル

DataSetにFillするとDataSet内のDataTableコレクションの「0」番目
にデータが入ります。
複数のテーブルを返すストアドプロシージャを使ったりすると
この限りではありませんが…
単に、ひとつだけのテーブルが対象ならDataTableにFillした方が
リソースも少なくて済むんじゃないかな?

通常、そのページで必要なテーブルがひとつだけの場合はDataTable
をひとつ用意したほうがコーディングも少なくて済むと思いますよ。(^^)
es
常連さん
会議室デビュー日: 2003/08/18
投稿数: 20
投稿日時: 2003-08-31 09:41
Mickyさんありがとうございます。
なるほど、DataSetとDataTableがわかりました。

Jittaさん、いつもありがとうございます。
コードをみて、やってみます。
また何かあったときは、お願いします。

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