tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルDataGridでカラムスタイルの設定をすると最後の項目が表示されなくなる
記事No7057
投稿日: 2008/02/21(Thu) 12:29
投稿者
いつもお世話になります。Kと申します。

環境:WinXP+SP2 VB.net2003+SP1

表題の件ですが、現在作成中のアプリケーションでDataGrid上に42項目
表示させようとしたのですが、なぜかカラムスタイルの設定をすると
41項目までしか表示されません。

色々と調べたのですがわからず、ご質問させていただきました。
ネット上では、DataGridViewでは、100項目まで大丈夫だという記事を
見ましたが、DataGridについてはわかりませんでした。(同じだとは思いますが)
プログラムをデバッグし、42項目目まできちと項目の設定をテーブルスタイルに
追加をしている事は確認しました。
カラム設定をしない(テーブルスタイルにカラムスタイルを追加しない)場合は、
42項目全て表示されました。

処理としては簡単に
1.SQL文作成
2.DataAdapterで検索
3.DataAdapterをFill
4.カラムスタイルの設定
5.テーブルスタイルにカラムスタイルを追加
6.42個項目まで4、5をFor文でループ
7.テーブルスタイルをDataGridに追加
8.DataGridにデータを表示
こんな感じです。

もし、同じような経験をお持ちの方がいらっしゃいましたら
ご教授いただけないでしょうか?

ご不明な点がありましたら、ご指摘ください。
よろしくお願いいたします。

[ツリー表示へ]
タイトルRe: DataGridでカラムスタイルの設定をすると最後の項目が表示されなくなる
記事No7060
投稿日: 2008/02/22(Fri) 08:58
投稿者花ちゃん
> 表題の件ですが、現在作成中のアプリケーションでDataGrid上に42項目
> 表示させようとしたのですが、なぜかカラムスタイルの設定をすると
> 41項目までしか表示されません。

50項目まで試してみましたが、表示及びカラムスタイルの変更もできました。
どこかコードが間違っていたりしませんか?
間違っていないなら、他の人も試す事ができる、テストコードを作って
投稿して見て下さい。
(上記の過程で原因が判明する場合もあります)

[ツリー表示へ]
タイトルRe^2: DataGridでカラムスタイルの設定をすると最後の項目が表示されなくなる
記事No7061
投稿日: 2008/02/22(Fri) 11:53
投稿者
> > 表題の件ですが、現在作成中のアプリケーションでDataGrid上に42項目
> > 表示させようとしたのですが、なぜかカラムスタイルの設定をすると
> > 41項目までしか表示されません。
>
> 50項目まで試してみましたが、表示及びカラムスタイルの変更もできました。
> どこかコードが間違っていたりしませんか?
> 間違って以内なら、他の人も試す事ができる、テストコードを作って
> 投稿して見て下さい。
> (上記の過程で原因が判明する場合もあります)

花ちゃん様、いつもありがとうございます。
こちらでも、試しに50項目のデータを表示させる単純なコードを作成し
試したところ、問題なく50項目表示されました。
サンプルコードはまだ作成していませんが、作成できたら載させていただきます。
(サンプルコードで原因がわかるかも知れませんが・・・(^^;)

[ツリー表示へ]
タイトルRe^2: DataGridでカラムスタイルの設定をすると最後の項目が表示されなくなる
記事No7065
投稿日: 2008/02/22(Fri) 15:31
投稿者
いつもお世話になっています。
再現ソースができました。このソースで再現しました。
この再現ソースを作りながらも、色々と調べてみました。
1.データを呼び出しているのはクエリ(クエリAとします)からで、
  1つのクエリ(クエリBとします)と3つのテーブルの組合わせです。
  クエリBでは、4つのテーブルの組み合わせです。
  この場合、42個目の項目がDataGridに表示されません。
2.クエリAからの呼び出しの場合いくつか項目を減らしても、最後の項目が
  DataGridに表示されない。
3.データを呼び出す所を1つのテーブルだけにすると、50項目でも表示されます。

以上の事からプログラムの問題ではなく、データベース上で作成したクエリに問題が
あるのでは・・・?と考えています。
そうなれば、質問する場所を替えないといけませんね。
一応データベースにあるクエリのデータを見ると、表示されない項目(42個目)にもデータは入っています。

Public Class Form1
    Inherits System.Windows.Forms.Form

    Public 項目() As String = { 42項目 }

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim oleCn As New OleDb.OleDbConnection
        Dim oleCmd As OleDb.OleDbCommand
        Dim oleReader As OleDb.OleDbDataReader
        Dim dAdp1 As OleDb.OleDbDataAdapter
        Dim dSet1 As DataSet = New DataSet("表示データ")
        Dim SQLCmd, DataBase As String
        Dim n As Integer
        Dim tblStyle1 As New DataGridTableStyle
        Dim clmStyle1(42) As DataGridTextBoxColumn

        'データベースの格納場所
        DataBase = "XXX.mdb"

        'データベース定義
        oleCn.ConnectionString = _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & DataBase & ";" & _
            "Persist Security info=False"

        'データベースオープン
        oleCn.Open()

        'データを検索
        SQLCmd = "select " & 項目(0)
        For n = 1 To 41
            SQLCmd = SQLCmd & ", " & 項目(n)
        Next
        SQLCmd = SQLCmd & " from クエリ"
        dAdp1 = New OleDb.OleDbDataAdapter(SQLCmd, oleCn)
        dAdp1.Fill(dSet1, "表示データ")
        tblStyle1.MappingName = "表示データ"
        For n = 0 To 41
            clmStyle1(n) = New DataGridTextBoxColumn
            clmStyle1(n).MappingName = 項目(n)
            clmStyle1(n).HeaderText = 項目(n)
            clmStyle1(n).NullText = ""
            '金額表示項目
            If n = 22 Or n = 23 Or n = 24 Then
                clmStyle1(n).Format = "c"
                clmStyle1(n).Alignment = HorizontalAlignment.Right
            End If
            'ユーザに入力して欲しくない項目を読込専用にする
            If n < 6 Or n > 11 Then
                clmStyle1(n).ReadOnly = True
            End If
            tblStyle1.GridColumnStyles.Add(clmStyle1(n))
        Next

        DataGrid1.TableStyles.Add(tblStyle1)
        DataGrid1.SetDataBinding(dSet1, "表示データ")
    End Sub
End Class

[ツリー表示へ]
タイトル原因がわかってきました・・・
記事No7081
投稿日: 2008/02/23(Sat) 12:02
投稿者
昨日のサンプルプログラムの投稿後も、次のような事をを試してみました。

・DataAdapterではなくDataReaderを使った場合、項目名は表示されるが
 データが表示されない。

そこで再度データベース及びテーブルの構成を確認してみたところ
表示されない項目が数値型になっていて、フィールドプロパティの
フィールドサイズがバイト型になっていました。
(先人が作成したもので、よく確認してませんでした(^^;)

DataReaderで作っていたアプリケーションでは、データを読み込む際に
oleReader.GetInt32を使っていましたが、これをoleReader.GetByteに
変更したところ、データが表示されるようになりました。
ただDataAdapterの場合、DataAdapterの内部でどのように処理されているか
わかりませんが、数値型/バイト型が影響しているように思われます。

もしどなたかこの事について対処法等ご存知の方がいらっしゃいましたら
アドバイス願います。今後の参考にさせていただきたいです。

[ツリー表示へ]