トップ回答者
datagridviewの行ヘッダー選択時のセルの文字・背景色の変更方法

質問
-
現在、下記のコードで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
しかし、行ヘッダーを選択した状態で同じ行の最初の列のセルをクリックしても、文字と背景色が元々の状態に戻りません。
現状のコードですと、行ヘッダーから同じ行の最初の列のセルへの移動が上手く取得できていないようです。
どなたか解決方法をご教示いただけないでしょうか?
回答
-
選択/選択解除されたときに明示的に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
すべての返信
-
選択/選択解除されたときに明示的に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
-
ありがとうございます。
教えていただいたイベントと方法で、元の色に戻すというコードを使わずとも行ヘッダーから選択が外れた際に元々の色に戻すことが出来るようになりました。
しかし、行の選択を取得した後下記のようなコードを使用しても行全体の色が変更され最初の列のみ色を変更しないということが出きません。
このイベントで行の個別のセルのスタイルを変更する方法をもう少しご教示できないでしょうか?
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