none
DataGridView上の特定のテキストのセルの文字色を変更したい RRS feed

  • 質問

  • DataGridView上の特定の文字列のセルの文字色を変更したいですがやり方がわかりません。

    例えば5列目1行目と5行目にAAAがあってこれを赤色、5列目3行目と4行目にBBBがあってこれを青色、といった感じで文字色変更したいです。

    下記のコードでセルを選んで文字色を変えることには成功しましたがここからどのようにすれば、AAAやBBBといった文字列のセルの文字色を変更できるかがわかりません。

    Me.database.Item(5, 1).Style.ForeColor = Color.Red

    2018年3月15日 4:08

回答

  • 特定セルの文字列全体の色を変えたいという程度(CellStyleの設定で済む程度)でしたら、CellPaintingイベントで自前描画する必要はなく、CellFormattingイベントで、e.Valueなどを確認してe.CellStyle.ForeColor = Color.Redするなどで対応できます。
    • 編集済み Hongliang 2018年3月15日 4:45
    • 回答としてマーク T.K.Tora 2018年3月16日 17:18
    2018年3月15日 4:44
  • 深読みかもしれませんが、DataGridView 上に表示している全データに対して、検索して該当行をハイライトする機能、
    要は検索機能を作られたいのかなと思いました(違ってたらごめんなさい)。

    1、【特定の文字列を条件式に設定する】方法としては、文字列比較と同じ考え方でできます。
    つまり、完全一致(セルの値=検索文字列)、部分一致(セルの値.Contains(検索文字列))、複雑な部分一致(Regex.IsMatch(検索文字列、パターン))という具合です。AccessDeny 様がおっしゃられている正規表現は3番目ですね。

    2.DataGridView の CellFormatting イベントを購読すると、セルの調整を行うことが出来るようになります。
    【e.Value】には各セルの値が入ってきます。多分ですが、セルに文字列をセットしているので、e.Value には文字列が入ってきていると思います。
    Console.WriteLine(e.Value) で中身を確認することが可能です。e.Value 自体は Object 型ですが、中身は String 型なはず。

    【e.Value】と1.の組み合わせを、If 文の条件式に書けば、質問者様のやりたいことができそうな気がしました。

    • 回答としてマーク T.K.Tora 2018年3月16日 17:18
    2018年3月16日 12:12

すべての返信

  • 一般的には、CellPaintingイベントで自前で描画することになります。
    以下が参考になると思います。

    C# DataGridViewで一つのセル内の特定の文字だけフォントカラーを変える方法について
    https://qa.atmarkit.co.jp/q/3851

    VBからC#への変換は、例えば以下でできます。

    Code Translation for .NET (C#<->VB.NET<->TypeScript<->Java)
    http://www.carlosag.net/Tools/CodeTranslator/


    ★良い回答には質問者は回答済みマークを、閲覧者は投票を!

    2018年3月15日 4:28
    モデレータ
  • 特定セルの文字列全体の色を変えたいという程度(CellStyleの設定で済む程度)でしたら、CellPaintingイベントで自前描画する必要はなく、CellFormattingイベントで、e.Valueなどを確認してe.CellStyle.ForeColor = Color.Redするなどで対応できます。
    • 編集済み Hongliang 2018年3月15日 4:45
    • 回答としてマーク T.K.Tora 2018年3月16日 17:18
    2018年3月15日 4:44
  • trapemiyaさん、Hongliangさん回答ありがとうございます。

    外出中なので帰宅後試したいと思います。

    2018年3月15日 6:58
  • 「e.Valueなどを確認して」とはDataGridViewのデータの中からAAAのセルがあるか確認して、あればそのセルの文字色を赤に変えるということだとおもうのですが、よくわかりませんでした。すいません。。。

    If セルの値が"AAA”なら Then

    'セルの色を青に変える

    Me.DGV.Columns(5).DefaultCellStyle.ForeColor = Color.Blue

    ElseIf セルの値が"BBB”なら Then

    Me.DGV.Columns(5).DefaultCellStyle.ForeColor = Color.Red

    Else セルの値が"CCC”なら Then

    Me.DGV.Columns(5).DefaultCellStyle.ForeColor = Color.Green

    End If

    こんな感じで考えているのですが特定の文字列を条件式に設定する方法がわかりません。

    2018年3月16日 10:52
  • こんばんは。

    特定の文字列を条件式に設定というのはこういうことですか?
    https://dobon.net/vb/dotnet/string/regexismatch.html
    2018年3月16日 10:57
  • こんばんわ!

    いろいろなことができるんですね。私は初心者なので新しい発見ばかりです。

    文字色の形式というよりは文字列の文字列?文字列AAA、文字列BBBのセルを特定して色を変えてたいと考えています。

    2018年3月16日 11:06
  • 文字列が完璧に固定されているのでしたら、普通に比較でよいのかと。
    https://dobon.net/vb/dotnet/string/stringequals.html

    もし、メール アドレスのような形式、郵便番号みたいな形式、と
    固定されていないのであれば正規表現をつかえばよいのではないでしょうか。
    と、思ったのですが、ご質問の意図を私が受け止められておりますか??

    慣れてないとのことでしたので、正規表現はこちらのほうがわかりやすいかもです。
    http://www.atmarkit.co.jp/ait/articles/1701/25/news025.html

    あと Else には条件は入れれないかと、「それ以外」ですかね。

    • 編集済み AccessDeny 2018年3月16日 11:28 追記
    2018年3月16日 11:21
  • 深読みかもしれませんが、DataGridView 上に表示している全データに対して、検索して該当行をハイライトする機能、
    要は検索機能を作られたいのかなと思いました(違ってたらごめんなさい)。

    1、【特定の文字列を条件式に設定する】方法としては、文字列比較と同じ考え方でできます。
    つまり、完全一致(セルの値=検索文字列)、部分一致(セルの値.Contains(検索文字列))、複雑な部分一致(Regex.IsMatch(検索文字列、パターン))という具合です。AccessDeny 様がおっしゃられている正規表現は3番目ですね。

    2.DataGridView の CellFormatting イベントを購読すると、セルの調整を行うことが出来るようになります。
    【e.Value】には各セルの値が入ってきます。多分ですが、セルに文字列をセットしているので、e.Value には文字列が入ってきていると思います。
    Console.WriteLine(e.Value) で中身を確認することが可能です。e.Value 自体は Object 型ですが、中身は String 型なはず。

    【e.Value】と1.の組み合わせを、If 文の条件式に書けば、質問者様のやりたいことができそうな気がしました。

    • 回答としてマーク T.K.Tora 2018年3月16日 17:18
    2018年3月16日 12:12
  • 正規表現自体をよく知らなかったのでリンク先を参考に少し調べてみます!

    >あと Else には条件は入れれないかと、「それ以外」ですかね。

    でしたね(汗 VB内だとエラーや補助がでて教えてくれるので大丈夫ですが、補助がないと凡ミスが、、、

    2018年3月16日 12:15
  • くどくすいません~。

    今当たってる問題含め、最終的に何をしたいのか、それに対して○○したのだけどだめだった。
    などなど、、記載したほうが、とても参考になる返信があると思いますよ~。

    よろしければご参考にしていただければと思いまふ。

    2018年3月16日 13:21
  • >【e.Value】と1.の組み合わせを、If 文の条件式に書けば、質問者様のやりたいことができそうな気がしました。

    下記のコードで思っていた処理ができました!

    >今当たってる問題含め、最終的に何をしたいのか、それに対して○○したのだけどだめだった。
    などなど、、記載したほうが、とても参考になる返信があると思いますよ~。

    ありがとうございます。次回からは最終的な目的なども詳しく状況を添えて質問したいと思います。

    最終的にはHongliangさんの

    >特定セルの文字列全体の色を変えたいという程度(CellStyleの設定で済む程度)でしたら、CellPaintingイベントで自前描画する必要はなく、CellFormattingイベントで、e.Valueなどを確認してe.CellStyle.ForeColor = Color.Redするなどで対応できます。

    の回答の段階で解決策がすでに出ていましたが15日の段階では勉強不足で回答の意味すらよくわかっていませんでした。(汗

    trapemiyaさんの回答のリンク先は私にはまだまだコードがどういう意味なのか理解するのが難しいです。これから理解できるように勉強させていただきます。。

    長くなりましたが、3日ほど悩んでいた問題だったのでうまくいってすごく嬉しいです。

    trapemiyaさん、Hongliangさん、AccessDenyさん、 sutefu7さん、回答ありがとうございました。

    CellPaintingイベント

    If e.Value = "AAA" Then

     e.CellStyle.ForeColor = Color.Red

    ElseIf e.Value = "BBB Then

     e.CellStyle.ForeColor = Color.Blue

    ....

    End If

    2018年3月16日 17:12