|
分類:[VB.NET/VB2005]
はじめまして。 現在VB.NETで Oracleと連携し、データの登録・検索・表示・印刷を行うツール の開発を行っています。 今回初めてDataGridコントロールやDataTableを扱うことになりました。 そこでどうしても分からない事が発生してしまったため、皆様のお知恵を拝借したく、書き込ませた頂きます。
問題の箇所はOracleからデータをDataSetに取得し、Boolean型のカラムを加えてDataGridに表示する部分です。 当初、コード1のように記述を行い、問題なくデータが表示できていました。 それを関数化するため、コード2のように書き換えたところ、Boolean型のカラムにデータが入らなくなってしまいました。
入るべきデータはコードの変更前後で共通で、Boolean型のカラムに格納されるデータはSelect文で直接0を指定しています。 コード1ではこれがBoolean型のカラムに格納されましたが、コード2の場合は格納されず、結果の末尾にDecimal型の新しいカラムが追加されてしまいます。そのためBoolean型のカラムはNullのままです。 最終的にカラムのスタイルが同じであることは確認しています。
原因は列スタイル部分だと思われますので関連するコードのみ記載します。 過不足等ありましたら申し訳ありませんがご指摘頂けると幸いです。
以下プログラム初心者のコードのためお見苦しいところ等あると思いますが…。 宜しくお願いいたします。
【共通コード:クラスの初期化:DataSet、DataTable、TableStyleの作成】 Public Sub New(ByRef SetTargetDataGrid As DataGridEx, ByVal DataSetName As String, ByVal DataTableName As String, ByRef SetDBConnectClass As Object) 'データグリッドコントロールを渡す targetDataGrid = SetTargetDataGrid DBConnectClass = SetDBConnectClass '------------------------------------------------- 'データセット作成 mDataSetName = DataSetName mDataSet = New DataSet(mDataSetName) '------------------------------------------------- 'データテーブル作成 mDataTblName = DataTableName mDataTbl = mDataSet.Tables.Add(mDataTblName) '------------------------------------------------- 'テーブルスタイルを作成してデータグリッドに追加 dgTableStyle = New DataGridTableStyle dgTableStyle.MappingName = mDataTblName targetDataGrid.TableStyles.Add(dgTableStyle) '------------------------------------------------- End Sub
【コード1】 *呼び出し元 dgTableStyle.GridColumnStyles.Add(test(i)) 'データをセット SetDataSet() '※ SQLを実行してデータをデータセットに。バイン
*コード Function test(ByVal i) Dim dgTableStyle As DataGridTableStyle 'データテーブルスタイル Const maxCol = 4 '表示する総カラム数 Dim sColumnName(maxCol) As String '各カラム名称を格納 Dim iColumnWidth(maxCol) As Integer '各カラム幅を格納 Dim dgColumn As DataColumn 'カラム作成時に格納するWORK変数 Dim dgColumnStyleStr '列スタイル作成時に格納するWORK変数(チェックボックス以外用) Dim dgColumnStyleBol '列スタイル作成時に格納するWORK変数(チェックボックス用) 'カラム名セット() sColumnName(0) = "chk" sColumnName(1) = "サーバ名" sColumnName(2) = "アカウント" sColumnName(3) = "ログイン日時" sColumnName(4) = "受理番号"
'カラム幅セット() iColumnWidth(0) = 40 iColumnWidth(1) = 100 iColumnWidth(2) = 60 iColumnWidth(3) = 120 iColumnWidth(4) = 70
If i = 0 Then dgColumn = New DataColumn(sColumnName(i), GetType(Boolean)) Else dgColumn = New DataColumn(sColumnName(i), GetType(String)) End If mDataTbl.Columns.Add(dgColumn) dgColumn = Nothing
'列スタイルを作成してテーブルスタイルに追加 If i = 0 Then 'チェックボックス dgColumnStyleBol = New DataGridBoolColumn dgColumnStyleBol.MappingName = sColumnName(i) dgColumnStyleBol.HeaderText = sColumnName(i) '見出し dgColumnStyleBol.Width = iColumnWidth(i) '幅 dgColumnStyleBol.Alignment = HorizontalAlignment.Center '中央寄せ dgColumnStyleBol.AllowNull = False 'Null禁止 dgColumnStyleBol.ReadOnly = False '書き込み可 test = dgColumnStyleBol Else 'チェックボックス以外 dgColumnStyleStr = New DataGridTextBoxColumn dgColumnStyleStr.MappingName = sColumnName(i) dgColumnStyleStr.HeaderText = sColumnName(i) dgColumnStyleStr.Width = iColumnWidth(i) dgColumnStyleStr.NullText = "" 'Nullの時空文字列 dgColumnStyleStr.ReadOnly = True test = dgColumnStyleStr End If End Function
【コード2】
*呼び出し元 clsDataGrid.AddColumn("chk", 40, GetType(Boolean), , False, False, "C") clsDataGrid.AddColumn("サーバ名", 110, GetType(String)) clsDataGrid.AddColumn("アカウント", 70, GetType(String)) clsDataGrid.AddColumn("ログイン日時", 160, GetType(String)) clsDataGrid.AddColumn("受理番号", 80, GetType(String)) clsDataGrid.AddColumn("ファイル名", 80, GetType(String))
'データをセット SetDataSet() '※ SQLを実行してデータをデータセットに。バイン
*コード '********************************************************************************** '* [ルーチン名]AddColumn '* [機能]データグリッド用のカラムを作成する '* [引数] ※*は省略不可 '* sColumnName :*カラム名 '* iColumnWidth :*カラムの幅 '* DataType :*データタイプ (ex: GetType(String)、GetType(Boolean) ) '* NullString :Nullの時の文字列(デフォルトは無し) '* ReadOnry :上書きの可否[ True :可 / False : 否 ](デフォルトはTrue) '* AllowNull :Null許可の可否[ True :可 / False : 否 ](デフォルトはTrue) '* justify :セル内の位置[ R:右 / C: 中央 / L: 左 ](デフォルトはLeft) '********************************************************************************** Function AddColumn(ByVal sColumnName As String, ByVal iColumnWidth As Integer, _ ByVal DataType As Object, Optional ByVal NullString As String = "", _ Optional ByVal ReadOnry As Boolean = True, Optional ByVal AllowNull As Boolean = True, _ Optional ByVal Justify As String = "L") Try
'---カラムを作成する--------------------------------------- Dim dgColumn As DataColumn 'カラム作成時に格納するWORK変数
dgColumn = New DataColumn(sColumnName, DataType) mDataTbl.Columns.Add(dgColumn) dgColumn = Nothing '---------------------------------------------------------
'---列スタイルを作成する------------------------------------ Dim dgColumnStyle '列スタイル作成時に格納するWORK変数
'データのタイプ If DataType Is GetType(String) Then dgColumnStyle = New DataGridTextBoxColumnEx dgColumnStyle.NullText = NullString ElseIf DataType Is GetType(Boolean) Then dgColumnStyle = New DataGridBoolColumn dgColumnStyle.AllowNull = AllowNull dgColumnStyle.NullValue = NullString End If
'各データタイプ共通の設定 dgColumnStyle.MappingName = sColumnName dgColumnStyle.HeaderText = sColumnName
'セル内の位置/右(R)・中央(C)以外は左寄せ Select Case Justify Case "R" dgColumnStyle.Alignment = HorizontalAlignment.Right Case "C" dgColumnStyle.Alignment = HorizontalAlignment.Center Case Else dgColumnStyle.Alignment = HorizontalAlignment.Left End Select dgColumnStyle.Width = iColumnWidth '幅 dgColumnStyle.ReadOnly = ReadOnry '書き込み可 dgTableStyle.GridColumnStyles.Add(dgColumnStyle) '---------------------------------------------------------
Catch ex As Exception 'MessageBox.Show(ex.Message) End Try End Function
|