単一選択モード(SingleSelect)でフォーカス枠の右辺が表示されない
対象製品
SPREAD for Windows Forms 7.0J
状況
修正済み
詳細
単一選択モード(SingleSelect)でフォーカス枠の右辺が表示されません。
拡張選択モード(ExtendedSelect)や複数選択モード(MultiSelect)でも同様の現象が発生します。
【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
--フォーカス枠の右辺が表示されません
【サンプルコード】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' SPREADの設定
FpSpread1.ActiveSheet.ColumnCount = 3
FpSpread1.ActiveSheet.OperationMode = FarPoint.Win.Spread.OperationMode.SingleSelect
End Sub
拡張選択モード(ExtendedSelect)や複数選択モード(MultiSelect)でも同様の現象が発生します。
【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
--フォーカス枠の右辺が表示されません
【サンプルコード】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' SPREADの設定
FpSpread1.ActiveSheet.ColumnCount = 3
FpSpread1.ActiveSheet.OperationMode = FarPoint.Win.Spread.OperationMode.SingleSelect
End Sub
回避方法
Service Pack 6(v7.0.2019.2008)で修正済み。
Service Pack 6(v7.0.2019.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
FocusRendererプロパティに独自のレンダラを設定します。
【サンプルコード】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = FpSpread1.ProductVersion
' SPREADの設定
FpSpread1.ActiveSheet.ColumnCount = 3
FpSpread1.ActiveSheet.OperationMode = FarPoint.Win.Spread.OperationMode.SingleSelect
' 対応策[1/2]:独自のレンダラの設定
FpSpread1.FocusRenderer = New CustomFocusRenderer(FpSpread1)
End Sub
'''
''' 対応策[2/2]:独自のレンダラ
'''
Public Class CustomFocusRenderer
Implements FarPoint.Win.Spread.IFocusIndicatorRenderer
Private spread As FarPoint.Win.Spread.FpSpread
Public Sub New(ByVal fs As FarPoint.Win.Spread.FpSpread)
spread = fs
End Sub
Public Sub Paint(ByVal g As Graphics, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal left As Boolean, ByVal top As Boolean, ByVal right As Boolean, ByVal bottom As Boolean) Implements FarPoint.Win.Spread.IFocusIndicatorRenderer.Paint
Dim xMin As Integer = spread.GetCellRectangle(0, 0, 0, 0).Left
Dim xMax As Integer = spread.GetCellRectangle(0, 0, 0, spread.ActiveSheet.ColumnCount - 1).Left
Using p As New Pen(Color.Black, 2)
If x = xMin Then g.DrawLine(p, New Point(x + 1, y), New Point(x + 1, y + height))
If x = xMax Then g.DrawLine(p, New Point(x + width - 1, y), New Point(x + width - 1, y + height))
g.DrawLine(p, New Point(x, y), New Point(x + width, y))
g.DrawLine(p, New Point(x, y + height), New Point(x + width, y + height))
End Using
End Sub
End Class
Service Pack 6(v7.0.2019.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
FocusRendererプロパティに独自のレンダラを設定します。
【サンプルコード】
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.Text = FpSpread1.ProductVersion
' SPREADの設定
FpSpread1.ActiveSheet.ColumnCount = 3
FpSpread1.ActiveSheet.OperationMode = FarPoint.Win.Spread.OperationMode.SingleSelect
' 対応策[1/2]:独自のレンダラの設定
FpSpread1.FocusRenderer = New CustomFocusRenderer(FpSpread1)
End Sub
'''
''' 対応策[2/2]:独自のレンダラ
'''
Public Class CustomFocusRenderer
Implements FarPoint.Win.Spread.IFocusIndicatorRenderer
Private spread As FarPoint.Win.Spread.FpSpread
Public Sub New(ByVal fs As FarPoint.Win.Spread.FpSpread)
spread = fs
End Sub
Public Sub Paint(ByVal g As Graphics, ByVal x As Integer, ByVal y As Integer, ByVal width As Integer, ByVal height As Integer, ByVal left As Boolean, ByVal top As Boolean, ByVal right As Boolean, ByVal bottom As Boolean) Implements FarPoint.Win.Spread.IFocusIndicatorRenderer.Paint
Dim xMin As Integer = spread.GetCellRectangle(0, 0, 0, 0).Left
Dim xMax As Integer = spread.GetCellRectangle(0, 0, 0, spread.ActiveSheet.ColumnCount - 1).Left
Using p As New Pen(Color.Black, 2)
If x = xMin Then g.DrawLine(p, New Point(x + 1, y), New Point(x + 1, y + height))
If x = xMax Then g.DrawLine(p, New Point(x + width - 1, y), New Point(x + width - 1, y + height))
g.DrawLine(p, New Point(x, y), New Point(x + width, y))
g.DrawLine(p, New Point(x, y + height), New Point(x + width, y + height))
End Using
End Sub
End Class