DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Fillを使うとカラムスタイルとテーブルスタイルが無効になる

環境/言語:[Windows2000 VB.NET .NET Framework1.1]
分類:[.NET]

いつも大変お世話になります。
本日もまたDataGrid関連の質問させてください。

今までは、OracleDataReaderでデータベースからデータを読み込んで、それをTableのRowをAddするやり方でデータグリッドにデータ表示をしていました。
ただ、データ数が多いとすごく遅いことと、CrystalReportsにて帳票作成が入ったので、DataSetを使う処理が出てきました。
そこでOracleDataAdapterとFillメソッドを使いたいのですが、何をどうやってもDataGridのカラムスタイルとテーブルスタイルが、Fillメソッドの後無効になります。
たとえば、列の幅やヘッダーの列名、その他偶数行の色づけ等すべてです。

このような現象の解決方法をご存知の方がいらっしゃれば、ご教授願えませんでしょうか?
いつもいつもこのような質問ばかりでご迷惑をお掛けしますが、何卒よろしくお願いいたします。
■No9041に返信(okaさんの記事)

平ちゃんです。お早うございます。

> ただ、データ数が多いとすごく遅いことと、CrystalReportsにて帳票作成が入ったので、DataSetを使う処理が出てきました。
速度やCrystalReportsに関しては経験が無いので、他の方にお願いするとして、


> そこでOracleDataAdapterとFillメソッドを使いたいのですが、何をどうやってもDataGridのカラムスタイルとテーブルスタイルが、Fillメソッドの後無効になります。
> たとえば、列の幅やヘッダーの列名、その他偶数行の色づけ等すべてです。

この件に関してはデータグリッドとテーブルのMappingName が一致しないことが原因ですので次を試してみて下さい。

以前の質問に書かれていたコードで話をすすめますと
http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=8875&rev=&no=0

DataSet1 = New DataSet("商品マスター") としていますので

以降のDataTable1.TableNameを"商品マスター"としてみたらどうでしょうか?

また Da.Fill((DataSet1, "商品マスター") とテーブル名が一致している事も必要です。
2005/02/10(Thu) 11:42:53 編集(投稿者)

■No9044に返信(平ちゃんさんの記事)

自己レスです
間違って書いてしまいました。
もし参考にしていたらすみません。
次のように訂正します。

>
> DataSet1 = New DataSet("商品マスター") としていますので


ここをから後ろの部分を

DataTable1 = DataSet1.Tables.Add("商品テーブル") としていますので
以降のDataTable1.TableNameを "商品テーブル" としてみたらどうでしょうか?

また Da.Fill((DataSet1, "商品テーブル") とテーブル名が一致している事も必要です。

のように書きたかったのです。
最初の文ですと意味不明な文章なので??ですね。すみません
■No9047に返信(平ちゃんさんの記事)

平ちゃんさん、いつもご丁寧に教えていただきまして本当にありがとうございます。
さて、教えていただいたことを元に色々試したところ、現象としては今度はさっきと逆で、カラムやテーブルのスタイル自体は適用されているのですが、データが入りません。
すべて(NULL)になって表示されてしまいます。
SQL*PLUSで同SQLを記述するとデータの取得はできています。
ただ、Fillメソッドの後で行数自体は正常に取得データ数分追加されているという変な現象です。

現状こんな感じでやっていますが、まずい点等お気づきの場合は、これまた大変図々しいですが、ご指摘いただけないでしょうか。
本当に申し訳ありません。

Private ds As DataSet '倉庫一覧DataGridのDataSetオブジェクト
Private dt As DataTable '倉庫一覧DataGridのDataTableオブジェクト

'データグリッド初期化関数
Private Sub InitDataGrid()

Dim i As Integer
Dim dgTableStyle As DataGridTableStyle
Dim sColumnName(1) As String
Dim iColumnWidth(1) As Integer
Dim dgColumn(1) As DataColumn
Dim dgColumnStyle(1) As DataGridTextBoxColumn

DataGrid1.ReadOnly = True

'データセット作成
ds = New DataSet("倉庫")

'データテーブル作成
'Me.dt = ds.Tables.Add("Warehouse")
dt = ds.Tables.Add("一覧")


'テーブルスタイルを作成してデータグリッドに追加
dgTableStyle = New DataGridTableStyle
'dgTableStyle.MappingName = "Warehouse"
dgTableStyle.MappingName = "一覧"
dgTableStyle.AlternatingBackColor = Color.FromArgb(235, 235, 235)
DataGrid1.TableStyles.Add(dgTableStyle)

'カラム名セット
sColumnName(0) = "コード"
sColumnName(1) = "倉庫名称"

'カラム幅セット
iColumnWidth(0) = 52
iColumnWidth(1) = 170


'カラム作成
For i = 0 To 1
dgColumn(i) = New DataColumn(sColumnName(i), GetType(String))
Me.dt.Columns.Add(dgColumn(i))
Next


'列スタイルを作成してテーブルスタイルに追加
For i = 0 To 1
dgColumnStyle(i) = New DataGridTextBoxColumn
dgColumnStyle(i).MappingName = sColumnName(i)
dgColumnStyle(i).HeaderText = sColumnName(i)
dgColumnStyle(i).Width = iColumnWidth(i)
dgColumnStyle(i).Alignment = HorizontalAlignment.Center
dgTableStyle.GridColumnStyles.Add(dgColumnStyle(i))
Next

'データグリッドにテーブルを表示する
DataGrid1.SetDataBinding(ds, "一覧")

End Sub


  'データ取得してグリッドにセットする
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

Dim sSql As String
Dim oraAdp As OracleDataAdapter

ds.Clear()

sSql = "select 倉庫コード, 倉庫名 from 倉庫マスター"

oraAdp = New OracleDataAdapter(g_oraCmd)
oraAdp.SelectCommand.CommandText = sSql

oraAdp.Fill(ds, "一覧")
DataGrid1.DataSource = ds

End Sub
■No9050に返信(okaさんの記事)

頑張ってますね。

てんてこ舞いの状態でいうのも気の毒なのですが一日位かけてじっくりと
勉強した方が近道かもしれません。okaさんなら一日MSDN等で調べれば全体のイメージがつかめるでしょう。
私は別に手間でもないので構わないですが...

さてFill の件ですが最後のところの

> oraAdp.Fill(ds, "一覧")
> DataGrid1.DataSource = ds

これですとDataGrid1 に ds のテーブル "一覧" が指定されていません。

ですので
DataGrid1.SetDataBinding(ds, "一覧")
と指定します。
■No9051に返信(平ちゃんさんの記事)

平ちゃんさん、レスありがとうございます。

> てんてこ舞いの状態でいうのも気の毒なのですが一日位かけてじっくりと
> 勉強した方が近道かもしれません。okaさんなら一日MSDN等で調べれば全体のイメージがつかめるでしょう。

まさに平ちゃんさんのおっしゃる通りだと思います。
本来はそうあるべきであり、頂いたお言葉は厳しく受け止めたいと思います。
ただ、日々の進捗報告がそれを許してはくれないという苦しい言い訳のもと、むなしく現状に至っています。


>> さてFill の件ですが最後のところの
>
>> oraAdp.Fill(ds, "一覧")
>> DataGrid1.DataSource = ds
>
> これですとDataGrid1 に ds のテーブル "一覧" が指定されていません。
>
> ですので
> 'データグリッドにテーブルを表示する
DataGrid1.SetDataBinding(ds, "一覧")
> と指定します。

とありますが、
DataGrid1.SetDataBinding(ds, "一覧")
の一行は、グリッドの初期化の一番最後に指定していますが、これではだめでしょうか?
念のためFillメソッドの前後色々なところにそれを書き加えてみましたが、依然データが出力されません。(泣)

色々ソースを削りながら試してみたのですが、1つわかったことはカラムの作成とカラムスタイルの設定のところをコメントアウトすると設定したテーブルスタイルの状態でデータが出力されました。
(カラムを作っていないので、倉庫コード1列分のデータのみでしたが・・・)

カラムの作成とカラムスタイルの設定をしたものが、テーブルと正しく結びついていないのでしょうか?
それともデータをFillでセットするときにぜんぜん違うところに入れられているのでしょうか?
■No9052に返信(okaさんの記事)


>ただ、日々の進捗報告がそれを許してはくれないという苦しい言い訳のもと、むなしく現状に至っています。

大変ですね。......


さて
oraAdp.Fill(ds, "一覧") で ds の一覧という名前のテーブルにデータが読み込まれる筈ですので、それを  DataGrid1.SetDataBinding(ds, "一覧") で表示させる。という予定です。

oraAdp.Fill(ds, "一覧") の直後にds.Tables コレクションのどのテーブルに
データが読み込まれているか確認してみてください。
(デバッグの腕の見せ所でしょうか)


> カラムの作成とカラムスタイルの設定をしたものが、テーブルと正しく結びついていないのでしょうか?
> それともデータをFillでセットするときにぜんぜん違うところに入れられているのでしょうか?
>

多分この辺りでしょう
■No9055に返信(平ちゃんさんの記事)

平ちゃんさん、毎度毎度お世話掛けております。
okaです。

> oraAdp.Fill(ds, "一覧") の直後にds.Tables コレクションのどのテーブルに
> データが読み込まれているか確認してみてください。
> (デバッグの腕の見せ所でしょうか)
この低いデバッグの腕前でなんとか色々と調べてみました。
わかったことは、やはりカラムを作成してしまうとRowのCountは取れるものの、値がDBNullとなってしまうということです。

何とかならないものかとがんばりましたが、どうにもなりませんでした。
そこでいったん速度のことをあきらめて(←いいのかなあ)、テンポラリーのDataSetにFillでデータを格納し、それをループでDataGridとバインドしているDataSetのTableに書き込むという、なんともお粗末な方法で解決(?)することが出来ました。

こんな感じです。↓

Dim dst As New DataSet("test")
Dim tb As DataTable

oraAdp.Fill(dst)

Dim i As Integer
Dim myRow As DataRow
For i = 0 To 221 '←とりあえず決めうち
myRow = dt.NewRow
myRow(0) = dst.Tables(0).Rows(i).Item(0)
myRow(1) = dst.Tables(0).Rows(i).Item(1)
dt.Rows.Add(myRow)
Next

しかし、私の勝手なイメージではFillメソッドでテーブルに一気にデータを格納することができると思っているので、どうも納得がいかない逃げ方に思えてなりません。

カラムを作成しているテーブルにFillメソッド一発でデータをセットする方法をご存知でしたら、本当にお手数ですが、ご教授お願いいたします。
2005/02/10(Thu) 16:33:08 編集(投稿者)

お疲れ様です。HSD所属のbettaです。

的を得てるかわかりませんが、

dgColumnStyle(i).MappingName = sColumnName(i)

sSql = "select 倉庫コード, 倉庫名 from 倉庫マスター"
の列名が、一致してますか?
sSql = "select 倉庫コード AS コード, 倉庫名 AS 倉庫名称 from 倉庫マスター"
でいけそうな気がほんの少しします。
■No9063に返信(bettaさんの記事)

bettaさん、レスありがとうございます。

> 的を得てるかわかりませんが、
>
> dgColumnStyle(i).MappingName = sColumnName(i)
> と
> sSql = "select 倉庫コード, 倉庫名 from 倉庫マスター"
> の列名が、一致してますか?
> sSql = "select 倉庫コード AS コード, 倉庫名 AS 倉庫名称 from 倉庫マスター"
> でいけそうな気がほんの少しします。

まず、結果から申し上げますと、bettaさんのご指摘は的のど真ん中を命中しました。
教えていただいたとおりに、データベースのカラム名とDataGridのカラム名を合わせる事により、Fillメソッド一行でデータの格納をすることが出来ました。
これで安心して(?)CrystalReportsに悩むことができます。

bettaさん、平ちゃんさん、DataGrid素人相手にわかりやすく、しかも図々しい質問にご丁寧にお答えいただきまして、本当にありがとうございました。
おおげさですが、心からお礼申し上げます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板