環境:Visual Basic 2008
以下のように画面のLoad時にデータテーブルをバインドし、それを表示させるような
事をしていますが、その際に、データベースから読み出してきたデータの内容によって、
表示させたテキストの背景の色を変化させたいと考えています。
尚、DataRepeterを使う為にバインドさせています。
単純にテキストの背景の色を変更する事は簡単ですが、読み込んだデータをバインドさせた
後に条件を付けるという事は可能なのでしょうか?
やりたい事としては、読み込んだ管理番号が、0001番だったら、表示させているテキスト
の色を青くしたい という事です。
何度も質問して申し訳ありません。
教えて頂きたいと思います。
よろしくお願いします。
《現在の記述内容》
画面Load時の処理
'データセットにテーブルを追加する
dtTable = dtSet.Tables.Add("仕様書_T")
'テーブルにフィールドを追加する
'.Add("フィールド名", フィールドの型)で追加します
dtTable.Columns.Add("管理番号", Type.GetType("System.String"))
dtTable.Columns.Add("受付日チェック", Type.GetType("System.Boolean"))
dtTable.Columns.Add("返却日チェック", Type.GetType("System.Boolean"))
Dim Connection As New OracleConnection
Dim Command As New OracleCommand
Try
'Oracleへのコネクションの確立
Connection.ConnectionString = "User Id=XXXXXX; Password=999999; Data Source=XE"
'オープン
'Connection.Open()
'コマンド作成
Command.Connection = Connection
Try
Dim Select_SQL As String
'SQL文作成
Select_SQL = "select 管理番号,受付日チェック,返却日チェック from T_仕様書"
Dim adp As New OracleDataAdapter(Select_SQL, Connection)
dtSet.Clear()
adp.Fill(dtSet, "仕様書_T")
TXT_管理番号.DataBindings.Add("Text", "仕様書_T", "管理番号")
CHK_G受取日.DataBindings.Add("Checked", "仕様書_T", "受付日チェック")
CHK_G返却日.DataBindings.Add("Checked", "仕様書_T", "返却日チェック")
'データソースを連結する
BindingSource1.DataSource = dtSet
BindingSource1.DataMember = "仕様書_T"
DP_仕様書.DataMember = BindingSource1.DataMember
DP_仕様書.DataSource = BindingSource1.DataSource
Catch ex As Exception
' 例外が発生した時の処理
MsgBox(ex.Message)
End Try
Catch ex As Exception
' 例外が発生した時の処理
MsgBox(ex.Message)
End Try
BackColor用の項目を追加(GetType(Color))
※GetTypeで型名の文字列を渡すよりは型自体を渡した方が多少パフォーマンスが良いと思います。
BackColor用のバインディングを行う
adp.Fill(dtSet, "仕様書_T")
の後でループなどでBackColor用の項目にColor値を設定
前スレの私の投げた疑問ですが、"仕様書_T"は特に意味がなくNothingで
なければなんでもよいようです。DataRepeater側でDataMemberまで指定しているため。
また前スレのBoolean型でなければならない件ですが文字列でも"True"とか"False"などの文字列が作成した列に設定されていれば動作するようです。
Boolean型にはすべきだと思いますが。
shu様、ご回答ありがとうございます。
BackColor用の項目を追加との事ですが、それは新規で項目を追加しなければ
ならないという事でしょうか?
またどのように条件を記述したら良いかわからず、、、
もう少し教えて頂ければと思います。
よろしくお願いします。
'テーブルにフィールドを追加する
のあたりに
dtTable.Columns.Add("背景色", GetType(Color))
を追加
> dtSet.Clear()
dtSet.Rows.Clearに変更。項目定義をクリアする必要は無い為。
> adp.Fill(dtSet, "仕様書_T")
の後に
For Each row as DataRow in dtTable.Rows
Select Case True
Case 赤の条件
row("背景色") = Color.Red
Case 青の条件
row("背景色") = Color.Blue
End Select
Next
のように条件により各行の色を設定し
Bindings.Add("BackColor",〜,"背景色")
でバインドを追加
shu様、ご回答ありがとうございます。
教えて頂いた内容で、まずは簡単なロジックで動くように以下のように記述しました。
しかし、色の変化が見られず、、、、
私の記述がおかしいかと思われますが、何が間違っているでしょうか、、、
教えて下さい。
《記述内容》
dtTable.Columns.Add("背景色", GetType(Color))
adp.Fill(dtSet, "仕様書_T")
Dim ZZ_FLAG As Integer
ZZ_FLAG = 0
For Each row As DataRow In dtTable.Rows
Select Case True
Case ZZ_FLAG = 0
row("背景色") = Color.Red ← 全ての行で色が変わるように設定
End Select
Next
TXT_TEST.DataBindings.Add("BackColor", "仕様書_T", "背景色") ← TESTテキストの色を変えたい
よろしくお願いします。
> 私の記述がおかしいかと思われますが、何が間違っているでしょうか、、、
DataRepeaterのDataSource,DataMember設定は今まで通り行われていますでしょうか?
> dtSet.Clear()
の記述は変更されましたでしょうか?前コメで書いた内容ですが
dtTable.Rows.Clearの間違いでした。dtSetにはRowsがないのでエラーに
なると思います。
shu様、何度もご回答ありがとうございます。
DataRepeaterのDataSource,DataMember設定は特に今までとは何も変化は
ありません。
また、dtTable.Rows.Clearに関しては、正しく記載しました。
未だ色が変化せず、、、
色が変わらない件ですが、なんとなく原因がわかってきました。
画面の起動時に、新たにデータテーブルに項目を設定し、それをバインドする
場合には問題なくできるようになりました。
しかし、DataRepeaterを採用しており、条件によって何度も表示させるような事
をしている為、その際には起動時のロジックではなく、単純に条件によって取得された
データを再度データテーブルに格納して表示している為、当初のバインドが反映されず、、、
何か良い方法はないでしょうか、、、
> 何か良い方法はないでしょうか、、、
とりあえず記述されたコードを載せた方がよいかとおもいます。
考え方はLoad時であろうが他の処理であろうが同じです。必要なときに
どの色にするか判定して追加項目に設定すればよいです。
shu様、何度もご回答ありがとうございました。
ようやく解決する事ができました!!
ツイート | ![]() |