条件指定に関して

解決


misamisa  2012-12-10 17:19:40  No: 148008  IP: [192.*.*.*]

環境: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

編集 削除
shu  2012-12-11 00:21:06  No: 148009  IP: [192.*.*.*]

BackColor用の項目を追加(GetType(Color))
※GetTypeで型名の文字列を渡すよりは型自体を渡した方が多少パフォーマンスが良いと思います。
BackColor用のバインディングを行う

adp.Fill(dtSet, "仕様書_T")
の後でループなどでBackColor用の項目にColor値を設定


前スレの私の投げた疑問ですが、"仕様書_T"は特に意味がなくNothingで
なければなんでもよいようです。DataRepeater側でDataMemberまで指定しているため。

また前スレのBoolean型でなければならない件ですが文字列でも"True"とか"False"などの文字列が作成した列に設定されていれば動作するようです。
Boolean型にはすべきだと思いますが。

編集 削除
misamisa  2012-12-11 09:42:27  No: 148010  IP: [192.*.*.*]

shu様、ご回答ありがとうございます。

BackColor用の項目を追加との事ですが、それは新規で項目を追加しなければ
ならないという事でしょうか?

またどのように条件を記述したら良いかわからず、、、

もう少し教えて頂ければと思います。

よろしくお願いします。

編集 削除
shu  2012-12-11 16:34:37  No: 148011  IP: [192.*.*.*]

'テーブルにフィールドを追加する
のあたりに
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",〜,"背景色")
でバインドを追加

編集 削除
misamisa  2012-12-12 10:45:36  No: 148012  IP: [192.*.*.*]

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テキストの色を変えたい

よろしくお願いします。

編集 削除
shu  2012-12-12 11:35:40  No: 148013  IP: [192.*.*.*]

> 私の記述がおかしいかと思われますが、何が間違っているでしょうか、、、
DataRepeaterのDataSource,DataMember設定は今まで通り行われていますでしょうか?

> dtSet.Clear()
の記述は変更されましたでしょうか?前コメで書いた内容ですが
dtTable.Rows.Clearの間違いでした。dtSetにはRowsがないのでエラーに
なると思います。

編集 削除
misamisa  2012-12-12 11:55:48  No: 148014  IP: [192.*.*.*]

shu様、何度もご回答ありがとうございます。

DataRepeaterのDataSource,DataMember設定は特に今までとは何も変化は
ありません。

また、dtTable.Rows.Clearに関しては、正しく記載しました。

未だ色が変化せず、、、

編集 削除
misamisa  2012-12-13 11:33:56  No: 148015  IP: [192.*.*.*]

色が変わらない件ですが、なんとなく原因がわかってきました。

画面の起動時に、新たにデータテーブルに項目を設定し、それをバインドする
場合には問題なくできるようになりました。

しかし、DataRepeaterを採用しており、条件によって何度も表示させるような事
をしている為、その際には起動時のロジックではなく、単純に条件によって取得された
データを再度データテーブルに格納して表示している為、当初のバインドが反映されず、、、

何か良い方法はないでしょうか、、、

編集 削除
shu  2012-12-13 16:17:51  No: 148016  IP: [192.*.*.*]

> 何か良い方法はないでしょうか、、、
とりあえず記述されたコードを載せた方がよいかとおもいます。

考え方はLoad時であろうが他の処理であろうが同じです。必要なときに
どの色にするか判定して追加項目に設定すればよいです。

編集 削除
misamisa  2012-12-14 10:13:37  No: 148017  IP: [192.*.*.*]

shu様、何度もご回答ありがとうございました。

ようやく解決する事ができました!!

編集 削除