none
datagridviewの行ヘッダー選択時のセルの文字・背景色の変更方法 RRS feed

  • 質問

  • 現在、下記のコードでdatagridviewの行ヘッダーが選択された際に、その行の最初の列を除く残りのセルの文字と背景色を変更しようとしています。


        Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged

            '行が選択された場合
            If DataGridView1.Rows.GetRowCount(DataGridViewElementStates.Selected) <> 0 Then

                For Each r As DataGridViewRow In DataGridView1.SelectedRows

                    Dim ic As Integer
                    For ic = 1 To DataGridView1.ColumnCount - 1

                        DataGridView1(ic, r.Index).Style.SelectionForeColor = Color.White

                        DataGridView1(ic, r.Index).Style.BackColor = Color.Black

                    Next ic
                Next r
            End If


        End Sub

        Private Sub DataGridView1_CellLeave(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellLeave

            '行からフォーカスが外れた際に元の色に戻す
            Dim dt As DataTable = CType(DataGridView1.DataSource, DataTable)
            Dim i As Integer
            Dim i2 As Integer

            For i = 0 To dt.Rows.Count - 1
                For i2 = 0 To dt.Columns.Count - 1

                    DataGridView1(i2, i).Style.BackColor = Color.Empty
                    DataGridView1(i2, i).Style.SelectionForeColor = Color.Empty

                Next
            Next

        End Sub


    しかし、行ヘッダーを選択した状態で同じ行の最初の列のセルをクリックしても、文字と背景色が元々の状態に戻りません。
    現状のコードですと、行ヘッダーから同じ行の最初の列のセルへの移動が上手く取得できていないようです。

    どなたか解決方法をご教示いただけないでしょうか?

    2018年12月26日 6:44

回答

  • 選択/選択解除されたときに明示的にCellStyleを変更するのではなく、CellFormattingイベントでCellStyleを変更するようにするのはいかがでしょうか。

    DataGridView1.Rows(e.RowIndex).IsSelectedで行が選択されているかどうかを確認し、e.ColumnIndexが1以上ならe.CellStyle.色々を変更する、という感じです。

    これであれば「元の色に戻す」ということを意識しなくて済みます。

    // DataGridViewの各種イベントでは、e.RowIndex/e.ColumnIndexがマイナスになりうる点に注意。

    • 回答としてマーク AGS ASM 2018年12月26日 8:04
    2018年12月26日 7:06
  • CellFormattingイベントは全てのセルに対して発行されます。

    色を変える必要がない場合は何も処理する必要はないので、逆に言うと色を変えるセルだけe.Styleを設定すればいいということで、

    e.ColumnIndexが1以上ならe.CellStyle.色々を変更する

    と書きました。

    • 回答としてマーク AGS ASM 2018年12月26日 8:03
    2018年12月26日 7:56

すべての返信

  • 選択/選択解除されたときに明示的にCellStyleを変更するのではなく、CellFormattingイベントでCellStyleを変更するようにするのはいかがでしょうか。

    DataGridView1.Rows(e.RowIndex).IsSelectedで行が選択されているかどうかを確認し、e.ColumnIndexが1以上ならe.CellStyle.色々を変更する、という感じです。

    これであれば「元の色に戻す」ということを意識しなくて済みます。

    // DataGridViewの各種イベントでは、e.RowIndex/e.ColumnIndexがマイナスになりうる点に注意。

    • 回答としてマーク AGS ASM 2018年12月26日 8:04
    2018年12月26日 7:06
  • ありがとうございます。

    教えていただいたイベントと方法で、元の色に戻すというコードを使わずとも行ヘッダーから選択が外れた際に元々の色に戻すことが出来るようになりました。
    しかし、行の選択を取得した後下記のようなコードを使用しても行全体の色が変更され最初の列のみ色を変更しないということが出きません。
    このイベントで行の個別のセルのスタイルを変更する方法をもう少しご教示できないでしょうか?

                e.CellStyle.SelectionForeColor = Color.White
                e.CellStyle.BackColor = Color.Black

                DataGridView1(0, e.RowIndex).Style.SelectionForeColor = Color.Black
                DataGridView1(0, e.RowIndex).Style.BackColor = Color.White



    • 回答としてマーク AGS ASM 2018年12月26日 8:03
    • 回答としてマークされていない AGS ASM 2018年12月26日 8:04
    2018年12月26日 7:50
  • CellFormattingイベントは全てのセルに対して発行されます。

    色を変える必要がない場合は何も処理する必要はないので、逆に言うと色を変えるセルだけe.Styleを設定すればいいということで、

    e.ColumnIndexが1以上ならe.CellStyle.色々を変更する

    と書きました。

    • 回答としてマーク AGS ASM 2018年12月26日 8:03
    2018年12月26日 7:56
  • 申し訳ございません、e.ColumnIndexが1の意味が理解できておりませんでした。

    ご教示頂いた方法を再度、試みたところ思い通りのコードを作ることが出来ました。

    大変助かりました、ありがとうございます。

    2018年12月26日 8:03