C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

カラーコード(文字列)から色に変換したい /あい (20/03/23(Mon) 17:24) #94172
Re[1]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/23(Mon) 19:33) #94174
  └ Re[2]: カラーコード(文字列)から色に変換したい /あい (20/03/24(Tue) 08:53) #94179
    └ Re[3]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/24(Tue) 08:56) #94180
      └ Re[4]: カラーコード(文字列)から色に変換したい /あい (20/03/24(Tue) 10:02) #94181
        └ Re[5]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/24(Tue) 10:39) #94183
          └ Re[6]: カラーコード(文字列)から色に変換したい /あい (20/03/24(Tue) 13:38) #94188
            └ Re[7]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/24(Tue) 14:14) #94190
              └ Re[8]: カラーコード(文字列)から色に変換したい /あい (20/03/24(Tue) 15:17) #94191
                └ Re[9]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/24(Tue) 16:07) #94193
                  ├ Re[10]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/24(Tue) 16:19) #94195
                  └ Re[10]: カラーコード(文字列)から色に変換したい /あい (20/03/24(Tue) 16:16) #94194
                    └ Re[11]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/24(Tue) 16:40) #94198
                      └ Re[12]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 08:54) #94225
                        └ Re[13]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/26(Thu) 10:17) #94226
                          └ Re[14]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 10:32) #94227
                            └ Re[15]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/26(Thu) 10:47) #94228
                              └ Re[16]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 11:07) #94230
                                └ Re[17]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/26(Thu) 11:15) #94231
                                  └ Re[18]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 11:25) #94232
                                    └ Re[19]: カラーコード(文字列)から色に変換したい /魔界の仮面弁士 (20/03/26(Thu) 11:36) #94233
                                      ├ Re[20]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 13:10) #94238
                                      └ Re[20]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 13:17) #94240 解決済み
                                        └ Re[21]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 13:19) #94241
                                          └ Re[22]: カラーコード(文字列)から色に変換したい /あい (20/03/26(Thu) 13:19) #94242 解決済み


親記事 / ▼[ 94174 ]
■94172 / 親階層)  カラーコード(文字列)から色に変換したい
□投稿者/ あい (17回)-(2020/03/23(Mon) 17:24:55)

分類:[.NET 全般] 

いつもお世話になっております。
今回も宜しくお願い致します。

DBデータをDataGridViewで取得して表示しているのですが、カラーコード(例:#FFFFF)がそのまま表示している状態です。
これをカラーコードではなく色に変換して表示したいと考えております。
調べ不足かもしれないのですが、参考となるURLを見つけることができなかったので質問させて頂きました。

  【データ取得(FormLoad)】
        '接続情報を使ってコネクションを生成します。
        Using conn As New MySqlConnection(objConnection.ConnectionString)
            'MySQL文とコネクションを設定します。
            Using cmd As New MySqlCommand("SELECT BACKCOLOR FROM mst_color , conn)
                'MySQLへの橋渡しのアダプターを設定します。
                Dim sda As MySqlDataAdapter = New MySqlDataAdapter()
                ''SELECTコマンドを設定します。
                sda.SelectCommand = cmd
                'SELECTの実行及びフェッチ
                sda.Fill(dt)
                'グリッドに表示します。
                DataGridView1.DataSource = dt
            End Using
        End Using

データを取得する時点でなにかしらの変更をかけないといけないのかな?
とは、思うのですがやり方が分からず…。

どなたかお分かりになられる方宜しくお願い致します。

[ □ Tree ] 返信 編集キー/

▲[ 94172 ] / ▼[ 94179 ]
■94174 / 1階層)  Re[1]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2627回)-(2020/03/23(Mon) 19:33:38)
2020/03/23(Mon) 21:07:15 編集(投稿者)

掲示板投稿時に、『半角カナは使用しないでください。文字化けの原因になります。』という
注意書きが表示されていたかと思います。次回以降、ご留意ください。


No94172 (あい さん) に返信
> DBデータをDataGridViewで取得して表示しているのですが、カラーコード(例:#FFFFF)がそのまま表示している状態です。
> これをカラーコードではなく色に変換して表示したいと考えております。

"#FFFFF" ということは 5 桁ですか? ちょっと中途半端ですね。

Color と 16進数コードの変換には、ColorConverter クラスまたは ColorTranslator クラスを使えます。


Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
  If e.RowIndex < 0 Then
    Return
  End If

  'データバインド先の行を取り出します。
  Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)
  Dim rowView = TryCast(gridRow.DataBoundItem, DataRowView)
  If rowView Is Nothing Then
    Return
  End If

  'mst_color テーブルから、現在行の BACKCOLOR 列の値を取り出します。
  Dim oColor As Object = rowView("BACKCOLOR")
  If oColor Is Nothing OrElse oColor Is DBNull.Value Then
    Return
  End If


  'HTML カラー表記とみなして、Color 構造体に変換しています。
  Dim newBackColor = ColorTranslator.FromHtml(CStr(oColor))

  '透明度指定のある色だと扱いにくいので、
  'ここではあえて不透明に変更しています。
  newBackColor = Color.FromArgb(255, newBackColor)

  '文字色も背景色も同じ色にしてみました。
  '必要に応じて、文字色や選択色を調整してください。
  With e.CellStyle
    .SelectionBackColor = newBackColor
    .BackColor = newBackColor
    .SelectionForeColor = newBackColor
    .ForeColor = newBackColor
  End With
End Sub
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94174 ] / ▼[ 94180 ]
■94179 / 2階層)  Re[2]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (18回)-(2020/03/24(Tue) 08:53:25)
No94174 (魔界の仮面弁士 さん) に返信
> 掲示板投稿時に、『半角カナは使用しないでください。文字化けの原因になります。』という
> 注意書きが表示されていたかと思います。次回以降、ご留意ください。
すみません、修正するのを忘れていました。
以降、気をつけます。

> "#FFFFF" ということは 5 桁ですか? ちょっと中途半端ですね。
すみません、例としてだしたので適当に書きました。

> Color と 16進数コードの変換には、ColorConverter クラスまたは ColorTranslator クラスを使えます。
> 
> 
> Private Sub DataGridView1_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
>   If e.RowIndex < 0 Then
>     Return 
>   End If
> 
>   'データバインド先の行を取り出します。
>   Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)
>   Dim rowView = TryCast(gridRow.DataBoundItem, DataRowView)
>   If rowView Is Nothing Then
>     Return
>   End If
> 
>   'mst_color テーブルから、現在行の BACKCOLOR 列の値を取り出します。
>   Dim oColor As Object = rowView("BACKCOLOR")
>   If oColor Is Nothing OrElse oColor Is DBNull.Value Then
>     Return
>   End If
> 
> 
>   'HTML カラー表記とみなして、Color 構造体に変換しています。
>   Dim newBackColor = ColorTranslator.FromHtml(CStr(oColor))
> 
>   '透明度指定のある色だと扱いにくいので、
>   'ここではあえて不透明に変更しています。
>   newBackColor = Color.FromArgb(255, newBackColor)
> 
>   '文字色も背景色も同じ色にしてみました。
>   '必要に応じて、文字色や選択色を調整してください。
>   With e.CellStyle
>     .SelectionBackColor = newBackColor
>     .BackColor = newBackColor
>     .SelectionForeColor = newBackColor
>     .ForeColor = newBackColor
>   End With
> End Sub

色の変換ができました。ありがとうございます。
これをさらに色の表示をするセルを指定するとどのようになりますでしょうか?


[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94179 ] / ▼[ 94181 ]
■94180 / 3階層)  Re[3]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2628回)-(2020/03/24(Tue) 08:56:20)
No94179 (あい さん) に返信
> 色の変換ができました。ありがとうございます。
> これをさらに色の表示をするセルを指定するとどのようになりますでしょうか?

e.RowIndex に加えて、e.ColumnIndex も判定条件に加えてみてください。
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94180 ] / ▼[ 94183 ]
■94181 / 4階層)  Re[4]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (19回)-(2020/03/24(Tue) 10:02:26)
2020/03/24(Tue) 10:02:54 編集(投稿者)

No94180 (魔界の仮面弁士 さん) に返信
> e.RowIndex に加えて、e.ColumnIndex も判定条件に加えてみてください。

つまりはこういう事でしょうか?

'データバインド先の行を取り出す
Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)

Dim gridColumn = DirectCast(sender, DataGridView).Columns(e.ColumnIndex)←追加

Dim rowView = TryCast(gridRow.DataBoundItem, DataRowView)
If rowView Is Nothing Then
Return
End If
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94181 ] / ▼[ 94188 ]
■94183 / 5階層)  Re[5]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2629回)-(2020/03/24(Tue) 10:39:51)
2020/03/24(Tue) 11:24:10 編集(投稿者)

No94181 (あい さん) に返信
> つまりはこういう事でしょうか?

前提条件が提示されていないので判断できません。


あいさんにとって『色の表示をするセルを指定する』というのは、何を意味していますか?
「セルの値によって、どの列の色を変えるか」が変わったりするのでしょうか?


> Dim gridColumn = DirectCast(sender, DataGridView).Columns(e.ColumnIndex)←追加

色情報は mst_color.BACKCOLOR の値で良いとして、
どのセルを指定するのかという情報は、何を基準とするのでしょうか。


DataGridViewColumn の型や Name で判断するなら、.Columns(e.ColumnIndex) の取得も必要になりますが、
列番号だけで指定できる話ならば、e.ColumnIndex の値を
If ステートメント等で判断するだけで十分だと思います。

あるいはデータバインド先の DataRow の内容に左右されるなら、
先のサンプルの DataRowView インスタンスから拾えます。

もしくは非連結なセルの値を読み取る必要があるのなら、
 Dim dgv = DirectCast(sender, DataGridView)
 'Dim val = dgv(列名, 行番号).Value
 Dim val = dgv(列番号, 行番号).Value
などから値を拾えるでしょう。
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94183 ] / ▼[ 94190 ]
■94188 / 6階層)  Re[6]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (20回)-(2020/03/24(Tue) 13:38:21)
No94183 (魔界の仮面弁士 さん) に返信
> 前提条件が提示されていないので判断できません。
> 『色の表示をするセルを指定する』というのは、何を意味していますか?
> 「セルの値によって、どの列の色を変えるか」が変わったりするのでしょうか?
何個かデータがあるうちの一つのセルに、カラーコードのデータを表示しています。

------------------------------------
データ1|データ2|データ3|色表示
------------------------------------
        |        |        |#d7e4bd
------------------------------------
        |        |        |#ffcc66
------------------------------------

このような感じになっています。

[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94188 ] / ▼[ 94191 ]
■94190 / 7階層)  Re[7]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2631回)-(2020/03/24(Tue) 14:14:40)
2020/03/24(Tue) 14:17:52 編集(投稿者)

No94188 (あい さん) に返信
> 何個かデータがあるうちの一つのセルに、カラーコードのデータを表示しています。
> ------------------------------------
> データ1|データ2|データ3|色表示
> ------------------------------------
>     |    |    |#d7e4bd
> ------------------------------------
>     |    |    |#ffcc66
> ------------------------------------

(1) 上記のどこを着色したいのでしょうか?

たとえば「3 列目だけ」に色をつけたいのであれば、
CellFormatting イベントで 「e.ColumnIndex の値が 3 だった時」にのみ
e.CellStyle を調整するようなコードにすれば OK です。
調整が不要なセルの場合は、何も変更せずに Return してください。


(2) DataGridView 上に "#d7e4bd" という文字列は見えていた方が良いですか? 見えていない方が良いですか?

見えている必要がある場合は、該当セルのスタイルで、
前景色と背景色が同色もしくは近似色にならないようにしておきましょう。

見えている必要が無いのなら、そもそも [BACKGROUND] フィールドを DataGridView の列に
バインドする必要はありません。先のサンプルでも示したように、
イベント内からは DataBoundItem 経由で、DataTable 上の
[BACKGROUND] フィールドにアクセスできるためです。

 Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)
 Dim rowView As DataRowView= TryCast(gridRow.DataBoundItem, DataRowView)
 If rowView IsNot Nothing Then
   Dim oColor As Object = rowView("BACKCOLOR")
   'Dim row As DataRow = rowView.Row
   'Dim table As DataTable = row.Table
 End If


(3) 色情報の値検査を行う必要がありますか?

ColorTranslator.FromHtml() の場合、
たとえば "#ffcc66" の他、"#fc6" 形式の省略表記、
"LightSalmon"、"SandyBrown" などの Web カラー名や、
"InfoBackground" や "ThreeDDarkShadow" などのシステム名も扱えます。

もし、常に「# + 16進数6桁」形式しか認めない方針とするならば、
正規表現検査を加えた上で、不正な値の場合の着色方針を定める必要があるかもしれません。
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94190 ] / ▼[ 94193 ]
■94191 / 8階層)  Re[8]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (21回)-(2020/03/24(Tue) 15:17:19)
No94190 (魔界の仮面弁士 さん) に返信
>>------------------------------------
>>データ1|データ2|データ3|色表示
>>------------------------------------
>>    |    |    |#d7e4bd
>>------------------------------------
>>    |    |    |#ffcc66
>>------------------------------------
> 
> (1) 上記のどこを着色したいのでしょうか?
色表示の下のセルから着色したかったので下記のようにしたところ上手くいきました。
        '背景色セット
        If e.ColumnIndex = 3 Then
            With e.CellStyle
                .BackColor = newBackColor
            End With
        End If

> (2) DataGridView 上に "#d7e4bd" という文字列は見えていた方が良いですか? 見えていない方が良いですか?
>  Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)
>  Dim rowView As DataRowView= TryCast(gridRow.DataBoundItem, DataRowView)
>  If rowView IsNot Nothing Then
>    Dim oColor As Object = rowView("BACKCOLOR")
>    'Dim row As DataRow = rowView.Row
>    'Dim table As DataTable = row.Table
>  End If
文字は見えていない方がいいです。
上記のサンプルコードとプロパティのDataPropertyNameを消したところ上手くいきました。

 
> (3) 色情報の値検査を行う必要がありますか?
できれば常に「# + 16進数6桁」形式しか認めない方針としたいです。
新規追加または編集する場合、カラーダイアログボックスを表示して色を選択し表示するようにしています。
カラーダイアログボックスで選択された値はRGB値にしているのですが、これは「# + 16進数6桁」ではないですよね(-_-;)


[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94191 ] / ▼[ 94195 ] ▼[ 94194 ]
■94193 / 9階層)  Re[9]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2632回)-(2020/03/24(Tue) 16:07:15)
No94191 (あい さん) に返信
>>(3) 色情報の値検査を行う必要がありますか?
> できれば常に「# + 16進数6桁」形式しか認めない方針としたいです。

DataGridView のテキストセルへの直接入力であれば、
検証用のイベントが用意されています。
https://dobon.net/vb/dotnet/datagridview/cellvalidating.html


> カラーダイアログボックスで選択された値はRGB値にしているのですが、
> これは「# + 16進数6桁」ではないですよね(-_-;)

どうやって RGB 値にしているかが記されていないので、
正しいか間違っているかは判断できません…。


(1) Color → Alpha, Red, Green, Blue の個別要素の Byte 群
 Color の A, R, G, B プロパティ

(2) Color → &HAARRGGBB な Integer
 Color の ToArgb() メソッド

(3) Color → &HBBGGRR な Integer
 ColorTranslator の ToWin32(color) メソッド

(4) Color → "#RRGGBB" 形式の文字列 もしくは "Magenta" や "activeborder" などの定義済み色名
 ColorTranslator の ToHtml(color) メソッド

(5) Color → システムカラーは &H800000XX な Integer、それ以外は &HBBGGRR な Integer
 ColorTranslator の ToOle(color) メソッド

(6) Color → 元の Color 構造体に復元可能な文字列
 ColorConverter の ConvertToInvariantString(color) メソッド

(7) Color → 元の Color 構造体に復元可能な文字列
 Color の Name プロパティ


上記の逆変換はこうなります。

(1) … Color の FromArgb(a, r, g, b) メソッド ※ Alpha 値が 255 固定の場合に限り、FromArgb(r, g, b) でも可
(2) … Color の FromArgb(argb) メソッド
(3) … ColorTranslator の FromWin32(win32Color) メソッド
(4) … ColorTranslator の FromHtml(win32Color) メソッド
(5) … ColorTranslator の FromOle(win32Color) メソッド
(6) … ColorConverter の ConvertToInvariantString(win32Color) メソッド
(7) … Color の FromName(color) メソッド


=====
Color を (1)、(2)、(3) の方法で変換した場合、SystemColors を既知色に復元することができません。
Color を (4)、(5) の方法で変換した場合、Alpha 値は処理できません。(Transparent 等をのぞき、すべて不透明色扱い)
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94193 ] / 返信無し
■94195 / 10階層)  Re[10]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2633回)-(2020/03/24(Tue) 16:19:36)
No94193 (魔界の仮面弁士) に追記
>> できれば常に「# + 16進数6桁」形式しか認めない方針としたいです。

DataGridView で、ユーザーが色を選択可能な ColorPickerCell の実装例を紹介しておきます。
「# + 16進数6桁」用にするには追加の修正が必要になりますが、一応参考までに。
http://www.codeproject.com/Articles/24614/How-to-Host-a-Color-Picker-Combobox-in-Windows-For
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94193 ] / ▼[ 94198 ]
■94194 / 10階層)  Re[10]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (22回)-(2020/03/24(Tue) 16:16:54)
No94193 (魔界の仮面弁士 さん) に返信 
> どうやって RGB 値にしているかが記されていないので、
> 正しいか間違っているかは判断できません…。

'色の作成部分を表示可能にする
            cd.AllowFullOpen = True
            '純色だけに制限しない
            cd.SolidColorOnly = False
            '[作成した色]に指定した色(RGB値)を表示する
            cd.CustomColors = New Integer() {&H33, &H66, &H99, &HCC, &H3300, &H3333, &H3366, &H3399, &H33CC, &H6600, &H6633, &H6666, &H6699, &H66CC, &H9900, &H9933}
            'ダイアログを表示する
            If cd.ShowDialog() = DialogResult.OK Then
                '選択された色の取得
                DaraGridView1.Rows(e.RowIndex).Cells(3).Style.BackColor = cd.Color
            End If
            'ダイアログの開放
            Call cd.Dispose() : cd = Nothing : Call GC.Collect()

すみません、このようにやっていました。

[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94194 ] / ▼[ 94225 ]
■94198 / 11階層)  Re[11]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2634回)-(2020/03/24(Tue) 16:40:02)
No94194 (あい さん) に返信
> DaraGridView1.Rows(e.RowIndex).Cells(3).Style.BackColor = cd.Color

これは、どこのイベントから呼んでいますか?
上記の方法だけでは、ソート処理(列ヘッダー クリックなど)や
フィルター処理(DataView や BindingSource 等)に追従できないのでご注意ください。

要件次第では、データに応じてイベント内で e.CellStyle を操作する手法などと
併用した方が良いかと思います。



もちろん、ソート等が発生しない場合は、行・列指定での直接設定も可能です。
ただし、行やセル単位での Style への直接アクセスは、あまり推奨されておらず、
代わりに CellFormatting を使うことが提案されています。
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/best-practices-for-scaling-the-windows-forms-datagridview-control



なお、どうしても特定のセルの Style や Value を操作する必要がある場合には、
 DaraGridView1.Rows(e.RowIndex).Cells(3).〜
ではなく、
 DaraGridView1(3, e.RowIndex).〜
を使った方が手っ取り早いです。
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94198 ] / ▼[ 94226 ]
■94225 / 12階層)  Re[12]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (23回)-(2020/03/26(Thu) 08:54:43)
2020/03/26(Thu) 09:38:01 編集(投稿者)

No94198 (魔界の仮面弁士 さん) に返信
>>DaraGridView1.Rows(e.RowIndex).Cells(3).Style.BackColor = cd.Color
> これは、どこのイベントから呼んでいますか?

返信が遅くなり申し訳ございません。
CellContentClickイベントで行っております。

新規で行を追加する際に、
Dim newBackColor = ColorTranslator.FromHtml(CStr(oColor))
こちらの部分でエラーメッセージが表示されます。

型 'DBNull' から型 'String' への変換は無効です。
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94225 ] / ▼[ 94227 ]
■94226 / 13階層)  Re[13]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2642回)-(2020/03/26(Thu) 10:17:27)
No94225 (あい さん) に返信
> 新規で行を追加する際に、

新規行の対処方法は、No94193 で紹介した URL に記載されていますので、
新しく追加される行のセルの既定値を指定するようにしてみてください。


もしくは、既定値を指定する代わりに、
> Dim newBackColor = ColorTranslator.FromHtml(CStr(oColor))
の前に、「If IsDBNull(oColor) Then」などでチェックするという手もあろうかと思います。
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94226 ] / ▼[ 94228 ]
■94227 / 14階層)  Re[14]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (24回)-(2020/03/26(Thu) 10:32:50)
2020/03/26(Thu) 11:07:27 編集(投稿者)
No94226 (魔界の仮面弁士 さん) に返信
> 新規行の対処方法は、No94193 で紹介した URL に記載されていますので、
> 新しく追加される行のセルの既定値を指定するようにしてみてください。

> もしくは、既定値を指定する代わりに、
>> Dim newBackColor = ColorTranslator.FromHtml(CStr(oColor))
> の前に、「If IsDBNull(oColor) Then」などでチェックするという手もあろうかと思います。

なるほどですね、ありがとうございます。
何度も申し訳ないのですが、BindingSourceを使用する場合、バインド先の行を取得する際はどのようになるのでしょうか?
下記の部分です。

        'データバインド先の行を取り出す
        Dim oColor As Object = Nothing
        Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)
        Dim rowView As DataRowView = TryCast(gridRow.DataBoundItem, DataRowView)
        If rowView IsNot Nothing Then
            oColor = rowView("BG_COLOR")
        End If

[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94227 ] / ▼[ 94230 ]
■94228 / 15階層)  Re[15]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2643回)-(2020/03/26(Thu) 10:47:05)
半角カナ注意。

No94227 (あい さん) に返信
> BindingSourceを使用する場合、バインド先の行を取得する際はどのようになるのでしょうか?

BindingSource1.DataSource = [DataSet or DataTable or DataView or BindingSource]
DataGridView1.DataSource = BindingSource1

のような状況だとしたら、
> Dim rowView As DataRowView = TryCast(gridRow.DataBoundItem, DataRowView)
のままで変わらないです。


BindingSource.DataSource に渡しているのが As List(Of T) や As T() などの場合は、
 Dim rowView As T = TryCast(gridRow.DataBoundItem, T)
を試してみてください。(T は実際の型に置き換えます)
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94228 ] / ▼[ 94231 ]
■94230 / 16階層)  Re[16]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (25回)-(2020/03/26(Thu) 11:07:01)
No94228 (魔界の仮面弁士 さん) に返信
> 半角カナ注意。
またですね…本当に申し訳ないですm(_ _"m)

>>BindingSourceを使用する場合、バインド先の行を取得する際はどのようになるのでしょうか?

Private Sub From_Load
Me.bindingSource.DataSource = CreateDataTable()
End Sub

Private Function CreateDataTable() As DataTable
'MySQLからデータを取得し、グリッドに表示
End Function

上記のようであれば、
> BindingSource.DataSource に渡しているのが As List(Of T) や As T() などの場合
なので
>  Dim rowView As T = TryCast(gridRow.DataBoundItem, T)は
Dim rowView As CreateDataTable = TryCast(gridRow.DataBoundItem, CreateDataTable)
の認識で合っているでしょうか?


[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94230 ] / ▼[ 94232 ]
■94231 / 17階層)  Re[17]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2644回)-(2020/03/26(Thu) 11:15:18)
No94230 (あい さん) に返信
> Me.bindingSource.DataSource = CreateDataTable()
> Private Function CreateDataTable() As DataTable

これはつまり、現在の .DataSource は As DataTable なのであって、

>>BindingSource.DataSource に渡しているのが As List(Of T) や As T() などの場合

では無いという事になりますよね。


>> Dim rowView As T = TryCast(gridRow.DataBoundItem, T)は
> Dim rowView As CreateDataTable = TryCast(gridRow.DataBoundItem, CreateDataTable)
> の認識で合っているでしょうか?

もしも上記の書き方になるのだとすれば、
 Private Function CreateDataTable() As DataTable
ではなく、
 Private Function CreateDataTable() As List(Of CreateDataTable)
だったことになってしまいますよね…?


まずはデバッグすることから始めてみましょうか。

該当箇所で一時停止させて、gridRow.DataBoundItem から返される
インスタンスのデータ型が何になっているかを確認しましょう。
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94231 ] / ▼[ 94233 ]
■94232 / 18階層)  Re[18]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (26回)-(2020/03/26(Thu) 11:25:20)
No94231 (魔界の仮面弁士 さん) に返信
> まずはデバッグすることから始めてみましょうか。
>
> 該当箇所で一時停止させて、gridRow.DataBoundItem から返される
> インスタンスのデータ型が何になっているかを確認しましょう。

gridRow.DataBoundItemはオブジェクト型でした。
という事は、私の認識は違うということですね…。

CreateDataTable()がDataTableなのでそのまま
>Dim rowView As DataRowView = TryCast(gridRow.DataBoundItem, DataRowView)
を使えるという事ですね(?)



[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94232 ] / ▼[ 94238 ] ▼[ 94240 ]
■94233 / 19階層)  Re[19]: カラーコード(文字列)から色に変換したい
□投稿者/ 魔界の仮面弁士 (2645回)-(2020/03/26(Thu) 11:36:52)
2020/03/26(Thu) 11:59:09 編集(投稿者)

No94232 (あい さん) に返信
> gridRow.DataBoundItemはオブジェクト型でした。
> という事は、私の認識は違うということですね…。

プロパティの戻り値の定義を見るのではなく、
その Object 型に入っているインスタンスの型を見てください。

流石にインスタンスの型まで Object になることは
そうそう無いはず…。

デバッガのウォッチウィンドウやクイックウォッチで
確認するのが手っ取り早いですが、コードで確認するのなら
  Dim o As Object = gridRow.DataBoundItem
などとして、いったん変数に受けてから、
  Debug.WriteLine(TypeName(o))
もしくは
  Debug.WriteLine( If(o Is Nothing, "Nothing", o.GetType().FullName))
などとすれば確認できるかと思います。


> CreateDataTable()がDataTableなのでそのまま
>> Dim rowView As DataRowView = TryCast(gridRow.DataBoundItem, DataRowView)
> を使えるという事ですね(?)

そのはずですが、わざわざ質問されているという事は、
実際にはうまく稼働しなかったということなのですよね?
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94233 ] / 返信無し
■94238 / 20階層)  Re[20]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (27回)-(2020/03/26(Thu) 13:10:56)
No94233 (魔界の仮面弁士 さん) に返信
> デバッガのウォッチウィンドウやクイックウォッチで
> 確認するのが手っ取り早いですが、コードで確認するのなら
>   Dim o As Object = gridRow.DataBoundItem
> などとして、いったん変数に受けてから、
>   Debug.WriteLine(TypeName(o))
> もしくは
>   Debug.WriteLine( If(o Is Nothing, "Nothing", o.GetType().FullName))
> などとすれば確認できるかと思います。
System.Data.DataRowViewと表示されました。

> そのはずですが、わざわざ質問されているという事は、
> 実際にはうまく稼働しなかったということなのですよね?
新規で行を追加したく、BindingSourceを加えたところ稼働しなくなってしまいました…。




[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94233 ] / ▼[ 94241 ]
■94240 / 20階層)  Re[20]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (28回)-(2020/03/26(Thu) 13:17:47)
No94233 (魔界の仮面弁士 さん) に返信

すみません、勘違いでした。
上手く稼働しました。お助けいただきありがとうございます。

        If e.RowIndex < 0 Then
            Return
        End If

        'データバインド先の行を取り出す
        Dim oColor As Object = Nothing
        Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)
        Dim rowView As DataRowView = TryCast(gridRow.DataBoundItem, DataRowView)
        If rowView IsNot Nothing Then
            oColor = rowView("BG_COLOR")
        End If

        If IsDBNull(oColor) Then
        Else

            'HTMLカラー表記とみなして、Color構造体に変換する
            Dim newBackColor = ColorTranslator.FromHtml(CStr(oColor))
            ''透明度指定のある色だと扱いにくいため不透明に変更する
            newBackColor = Color.FromArgb(255, newBackColor)

            '背景色セット
            If e.ColumnIndex = 3 Then
                With e.CellStyle
                    .BackColor = newBackColor
                End With
            End If
        End If

解決済み
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94240 ] / ▼[ 94242 ]
■94241 / 21階層)  Re[21]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (29回)-(2020/03/26(Thu) 13:19:22)
No94240 (あい さん) に返信
If e.RowIndex < 0 Then
Return
End If

'データバインド先の行を取り出す
Dim oColor As Object = Nothing
Dim gridRow = DirectCast(sender, DataGridView).Rows(e.RowIndex)
Dim rowView As DataRowView = TryCast(gridRow.DataBoundItem, DataRowView)
If rowView IsNot Nothing Then
oColor = rowView("BG_COLOR")
End If

If IsDBNull(oColor) Then
Else

'HTMLカラー表記とみなして、Color構造体に変換する
Dim newBackColor = ColorTranslator.FromHtml(CStr(oColor))
''透明度指定のある色だと扱いにくいため不透明に変更する
newBackColor = Color.FromArgb(255, newBackColor)

'背景色セット
If e.ColumnIndex = 3 Then
With e.CellStyle> .BackColor = newBackColor
End With
End If
End If
[ 親 94172 / □ Tree ] 返信 編集キー/

▲[ 94241 ] / 返信無し
■94242 / 22階層)  Re[22]: カラーコード(文字列)から色に変換したい
□投稿者/ あい (30回)-(2020/03/26(Thu) 13:19:55)
解決し忘れです。
解決済み
[ 親 94172 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -