リサイズコンポーネントでFlexGridのリサイズ時に発生する問題を回避するリサイズポリシー
対象製品
PlusPak for Windows Forms 7.0J
詳細
リサイズコンポーネント(GcResize)を使用して、FlexGridグリッドをリサイズする場合、下記の問題が発生します。
本現象は、以下のコードを使用してユーザー定義のリサイズポリシーを追加することで対応できます。
なお、本現象はリサイズパネル(GcResizePanel)でも発生しますが、同じ方法で対応できます。
ユーザー定義のリサイズポリシーの使い方については、製品ヘルプの以下の内容をご参照ください。
PowerTools PlusPak for Windows Forms 7.0J
- PlusPak の使い方
- レイアウト
- GcResize コンポーネント
- リサイズポリシー
[Visual Basic]
Imports C1.Win.C1FlexGrid
Imports GrapeCity.Win.Components
Public Class C1FlexGridResizePolicy
Inherits ResizePolicy
Public Overrides ReadOnly Property TargetType() As Type
Get
Return GetType(C1FlexGrid)
End Get
End Property
Private _columnsDefaultSizeCatch As Integer
Private _rowsDefaultSizeCatch As Integer
Private _flexGridInfoCache As New Dictionary(Of Control, FlexGridInitInfo)()
Private _resizedCols As New Dictionary(Of RowColCollection, Object)()
Public Overrides Sub Initialize(control As System.Windows.Forms.Control)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
_flexGridInfoCache.Add(flexGrid, New FlexGridInitInfo(flexGrid.Rows.DefaultSize, flexGrid.Cols.DefaultSize, flexGrid.TopRow, flexGrid.LeftCol))
flexGrid.Styles(CellStyleEnum.FilterEditor).Font = TryCast(flexGrid.Styles(CellStyleEnum.FilterEditor).Font.Clone(), Font)
MyBase.Initialize(control)
End Sub
Public Overrides Sub Terminate(control As Control)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
flexGrid.TopRow = _flexGridInfoCache(control).TopRow
flexGrid.LeftCol = _flexGridInfoCache(control).LeftCol
_flexGridInfoCache.Remove(control)
_resizedCols.Clear()
MyBase.Terminate(control)
End Sub
Public Overrides Sub ResizeFont(control As System.Windows.Forms.Control, infos As ResizeFontInfo)
MyBase.ResizeFont(control, infos)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
For Each style As CellStyle In flexGrid.Styles
If [Object].ReferenceEquals(style.Font, flexGrid.Styles(CellStyleEnum.FilterEditor).Font) Then
Continue For
End If
ResizeStyle(infos, style)
Next
For Each column As Column In flexGrid.Cols
ResizeStyle(infos, column.Style)
ResizeStyle(infos, column.StyleFixed)
Next
For Each row As Row In flexGrid.Rows
ResizeStyle(infos, row.Style)
ResizeStyle(infos, row.StyleFixed)
Next
End Sub
Public Overrides Sub ResizeLayout(control As System.Windows.Forms.Control, infos As ResizeLayoutInfo)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
flexGrid.Cols.DefaultSize = infos.ScaleX(_flexGridInfoCache(control).DefaultColSize)
flexGrid.Rows.DefaultSize = infos.ScaleY(_flexGridInfoCache(control).DefaultRowSize)
If flexGrid.Rows.MinSize > 0 Then
flexGrid.Rows.MinSize = infos.ScaleY(flexGrid.Rows.MinSize)
End If
If flexGrid.Cols.MinSize > 0 Then
flexGrid.Cols.MinSize = infos.ScaleY(flexGrid.Cols.MinSize)
End If
If Not _resizedCols.ContainsKey(flexGrid.Cols) Then
' 列の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Cols, Nothing)
For Each column As Column In flexGrid.Cols
If column.Width > 0 Then
column.Width = infos.ScaleX(column.Width)
End If
Next
End If
If Not _resizedCols.ContainsKey(flexGrid.Rows) Then
' 行の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Rows, Nothing)
For Each row As Row In flexGrid.Rows
If row.Height > 0 Then
row.Height = infos.ScaleY(row.Height)
End If
Next
End If
MyBase.ResizeLayout(control, infos)
End Sub
Private Sub ResizeStyle(infos As ResizeFontInfo, style As CellStyle)
If style Is Nothing OrElse style.Font Is Nothing Then
Return
End If
Dim newFont As Font = infos.ScaleFont(style.Font)
If Not Object.ReferenceEquals(newFont, style.Font) Then
style.Font = newFont
End If
End Sub
Private Structure FlexGridInitInfo
Public Sub New(defaultRowSize__1 As Integer, defaultColSize__2 As Integer, topRow__3 As Integer, leftCol__4 As Integer)
DefaultRowSize = defaultRowSize__1
DefaultColSize = defaultColSize__2
TopRow = topRow__3
LeftCol = leftCol__4
End Sub
Public DefaultRowSize As Integer
Public DefaultColSize As Integer
Public TopRow As Integer
Public LeftCol As Integer
End Structure
End Class
[C#]
using C1.Win.C1FlexGrid;
using GrapeCity.Win.Components;
namespace ResizePolicies
{
public class C1FlexGridResizePolicy : ResizePolicy
{
public override Type TargetType
{
get { return typeof(C1FlexGrid); }
}
private int _columnsDefaultSizeCatch;
private int _rowsDefaultSizeCatch;
private Dictionary _flexGridInfoCache = new Dictionary();
private Dictionary _resizedCols = new Dictionary();
public override void Initialize(System.Windows.Forms.Control control)
{
C1FlexGrid flexGrid = control as C1FlexGrid;
_flexGridInfoCache.Add(flexGrid, new FlexGridInitInfo(flexGrid.Rows.DefaultSize, flexGrid.Cols.DefaultSize, flexGrid.TopRow, flexGrid.LeftCol));
flexGrid.Styles[CellStyleEnum.FilterEditor].Font = flexGrid.Styles[CellStyleEnum.FilterEditor].Font.Clone() as Font;
base.Initialize(control);
}
public override void Terminate(Control control)
{
C1FlexGrid flexGrid = control as C1FlexGrid;
flexGrid.TopRow = _flexGridInfoCache[control].TopRow;
flexGrid.LeftCol = _flexGridInfoCache[control].LeftCol;
_flexGridInfoCache.Remove(control);
_resizedCols.Clear();
base.Terminate(control);
}
public override void ResizeFont(System.Windows.Forms.Control control, ResizeFontInfo infos)
{
base.ResizeFont(control, infos);
C1FlexGrid flexGrid = control as C1FlexGrid;
foreach (CellStyle style in flexGrid.Styles)
{
if (Object.ReferenceEquals(style.Font, flexGrid.Styles[CellStyleEnum.FilterEditor].Font))
{
continue;
}
ResizeStyle(infos, style);
}
foreach (Column column in flexGrid.Cols)
{
ResizeStyle(infos, column.Style);
ResizeStyle(infos, column.StyleFixed);
}
foreach (Row row in flexGrid.Rows)
{
ResizeStyle(infos, row.Style);
ResizeStyle(infos, row.StyleFixed);
}
}
public override void ResizeLayout(System.Windows.Forms.Control control, ResizeLayoutInfo infos)
{
C1FlexGrid flexGrid = control as C1FlexGrid;
flexGrid.Cols.DefaultSize = infos.ScaleX(_flexGridInfoCache[control].DefaultColSize);
flexGrid.Rows.DefaultSize = infos.ScaleY(_flexGridInfoCache[control].DefaultRowSize);
if (flexGrid.Rows.MinSize > 0)
{
flexGrid.Rows.MinSize = infos.ScaleY(flexGrid.Rows.MinSize);
}
if (flexGrid.Cols.MinSize > 0)
{
flexGrid.Cols.MinSize = infos.ScaleY(flexGrid.Cols.MinSize);
}
if (!_resizedCols.ContainsKey(flexGrid.Cols))
{
// 列の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Cols, null);
foreach (Column column in flexGrid.Cols)
{
if (column.Width > 0)
{
column.Width = infos.ScaleX(column.Width);
}
}
}
if (!_resizedCols.ContainsKey(flexGrid.Rows))
{
// 行の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Rows, null);
foreach (Row row in flexGrid.Rows)
{
if (row.Height > 0)
{
row.Height = infos.ScaleY(row.Height);
}
}
}
base.ResizeLayout(control, infos);
}
private void ResizeStyle(ResizeFontInfo infos, CellStyle style)
{
if (style == null || style.Font == null)
{
return;
}
Font newFont = infos.ScaleFont(style.Font);
if (!object.ReferenceEquals(newFont, style.Font))
{
style.Font = newFont;
}
}
private struct FlexGridInitInfo
{
public FlexGridInitInfo(int defaultRowSize, int defaultColSize, int topRow, int leftCol)
{
DefaultRowSize = defaultRowSize;
DefaultColSize = defaultColSize;
TopRow = topRow;
LeftCol = leftCol;
}
public int DefaultRowSize;
public int DefaultColSize;
public int TopRow;
public int LeftCol;
}
}
}
- グリッドの行と列がコントロールに合わせてサイズ変更されない
本現象は、以下のコードを使用してユーザー定義のリサイズポリシーを追加することで対応できます。
なお、本現象はリサイズパネル(GcResizePanel)でも発生しますが、同じ方法で対応できます。
ユーザー定義のリサイズポリシーの使い方については、製品ヘルプの以下の内容をご参照ください。
PowerTools PlusPak for Windows Forms 7.0J
- PlusPak の使い方
- レイアウト
- GcResize コンポーネント
- リサイズポリシー
[Visual Basic]
Imports C1.Win.C1FlexGrid
Imports GrapeCity.Win.Components
Public Class C1FlexGridResizePolicy
Inherits ResizePolicy
Public Overrides ReadOnly Property TargetType() As Type
Get
Return GetType(C1FlexGrid)
End Get
End Property
Private _columnsDefaultSizeCatch As Integer
Private _rowsDefaultSizeCatch As Integer
Private _flexGridInfoCache As New Dictionary(Of Control, FlexGridInitInfo)()
Private _resizedCols As New Dictionary(Of RowColCollection, Object)()
Public Overrides Sub Initialize(control As System.Windows.Forms.Control)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
_flexGridInfoCache.Add(flexGrid, New FlexGridInitInfo(flexGrid.Rows.DefaultSize, flexGrid.Cols.DefaultSize, flexGrid.TopRow, flexGrid.LeftCol))
flexGrid.Styles(CellStyleEnum.FilterEditor).Font = TryCast(flexGrid.Styles(CellStyleEnum.FilterEditor).Font.Clone(), Font)
MyBase.Initialize(control)
End Sub
Public Overrides Sub Terminate(control As Control)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
flexGrid.TopRow = _flexGridInfoCache(control).TopRow
flexGrid.LeftCol = _flexGridInfoCache(control).LeftCol
_flexGridInfoCache.Remove(control)
_resizedCols.Clear()
MyBase.Terminate(control)
End Sub
Public Overrides Sub ResizeFont(control As System.Windows.Forms.Control, infos As ResizeFontInfo)
MyBase.ResizeFont(control, infos)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
For Each style As CellStyle In flexGrid.Styles
If [Object].ReferenceEquals(style.Font, flexGrid.Styles(CellStyleEnum.FilterEditor).Font) Then
Continue For
End If
ResizeStyle(infos, style)
Next
For Each column As Column In flexGrid.Cols
ResizeStyle(infos, column.Style)
ResizeStyle(infos, column.StyleFixed)
Next
For Each row As Row In flexGrid.Rows
ResizeStyle(infos, row.Style)
ResizeStyle(infos, row.StyleFixed)
Next
End Sub
Public Overrides Sub ResizeLayout(control As System.Windows.Forms.Control, infos As ResizeLayoutInfo)
Dim flexGrid As C1FlexGrid = TryCast(control, C1FlexGrid)
flexGrid.Cols.DefaultSize = infos.ScaleX(_flexGridInfoCache(control).DefaultColSize)
flexGrid.Rows.DefaultSize = infos.ScaleY(_flexGridInfoCache(control).DefaultRowSize)
If flexGrid.Rows.MinSize > 0 Then
flexGrid.Rows.MinSize = infos.ScaleY(flexGrid.Rows.MinSize)
End If
If flexGrid.Cols.MinSize > 0 Then
flexGrid.Cols.MinSize = infos.ScaleY(flexGrid.Cols.MinSize)
End If
If Not _resizedCols.ContainsKey(flexGrid.Cols) Then
' 列の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Cols, Nothing)
For Each column As Column In flexGrid.Cols
If column.Width > 0 Then
column.Width = infos.ScaleX(column.Width)
End If
Next
End If
If Not _resizedCols.ContainsKey(flexGrid.Rows) Then
' 行の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Rows, Nothing)
For Each row As Row In flexGrid.Rows
If row.Height > 0 Then
row.Height = infos.ScaleY(row.Height)
End If
Next
End If
MyBase.ResizeLayout(control, infos)
End Sub
Private Sub ResizeStyle(infos As ResizeFontInfo, style As CellStyle)
If style Is Nothing OrElse style.Font Is Nothing Then
Return
End If
Dim newFont As Font = infos.ScaleFont(style.Font)
If Not Object.ReferenceEquals(newFont, style.Font) Then
style.Font = newFont
End If
End Sub
Private Structure FlexGridInitInfo
Public Sub New(defaultRowSize__1 As Integer, defaultColSize__2 As Integer, topRow__3 As Integer, leftCol__4 As Integer)
DefaultRowSize = defaultRowSize__1
DefaultColSize = defaultColSize__2
TopRow = topRow__3
LeftCol = leftCol__4
End Sub
Public DefaultRowSize As Integer
Public DefaultColSize As Integer
Public TopRow As Integer
Public LeftCol As Integer
End Structure
End Class
[C#]
using C1.Win.C1FlexGrid;
using GrapeCity.Win.Components;
namespace ResizePolicies
{
public class C1FlexGridResizePolicy : ResizePolicy
{
public override Type TargetType
{
get { return typeof(C1FlexGrid); }
}
private int _columnsDefaultSizeCatch;
private int _rowsDefaultSizeCatch;
private Dictionary
private Dictionary
public override void Initialize(System.Windows.Forms.Control control)
{
C1FlexGrid flexGrid = control as C1FlexGrid;
_flexGridInfoCache.Add(flexGrid, new FlexGridInitInfo(flexGrid.Rows.DefaultSize, flexGrid.Cols.DefaultSize, flexGrid.TopRow, flexGrid.LeftCol));
flexGrid.Styles[CellStyleEnum.FilterEditor].Font = flexGrid.Styles[CellStyleEnum.FilterEditor].Font.Clone() as Font;
base.Initialize(control);
}
public override void Terminate(Control control)
{
C1FlexGrid flexGrid = control as C1FlexGrid;
flexGrid.TopRow = _flexGridInfoCache[control].TopRow;
flexGrid.LeftCol = _flexGridInfoCache[control].LeftCol;
_flexGridInfoCache.Remove(control);
_resizedCols.Clear();
base.Terminate(control);
}
public override void ResizeFont(System.Windows.Forms.Control control, ResizeFontInfo infos)
{
base.ResizeFont(control, infos);
C1FlexGrid flexGrid = control as C1FlexGrid;
foreach (CellStyle style in flexGrid.Styles)
{
if (Object.ReferenceEquals(style.Font, flexGrid.Styles[CellStyleEnum.FilterEditor].Font))
{
continue;
}
ResizeStyle(infos, style);
}
foreach (Column column in flexGrid.Cols)
{
ResizeStyle(infos, column.Style);
ResizeStyle(infos, column.StyleFixed);
}
foreach (Row row in flexGrid.Rows)
{
ResizeStyle(infos, row.Style);
ResizeStyle(infos, row.StyleFixed);
}
}
public override void ResizeLayout(System.Windows.Forms.Control control, ResizeLayoutInfo infos)
{
C1FlexGrid flexGrid = control as C1FlexGrid;
flexGrid.Cols.DefaultSize = infos.ScaleX(_flexGridInfoCache[control].DefaultColSize);
flexGrid.Rows.DefaultSize = infos.ScaleY(_flexGridInfoCache[control].DefaultRowSize);
if (flexGrid.Rows.MinSize > 0)
{
flexGrid.Rows.MinSize = infos.ScaleY(flexGrid.Rows.MinSize);
}
if (flexGrid.Cols.MinSize > 0)
{
flexGrid.Cols.MinSize = infos.ScaleY(flexGrid.Cols.MinSize);
}
if (!_resizedCols.ContainsKey(flexGrid.Cols))
{
// 列の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Cols, null);
foreach (Column column in flexGrid.Cols)
{
if (column.Width > 0)
{
column.Width = infos.ScaleX(column.Width);
}
}
}
if (!_resizedCols.ContainsKey(flexGrid.Rows))
{
// 行の設定は、複数のFlexGridで共有される場合があります。
_resizedCols.Add(flexGrid.Rows, null);
foreach (Row row in flexGrid.Rows)
{
if (row.Height > 0)
{
row.Height = infos.ScaleY(row.Height);
}
}
}
base.ResizeLayout(control, infos);
}
private void ResizeStyle(ResizeFontInfo infos, CellStyle style)
{
if (style == null || style.Font == null)
{
return;
}
Font newFont = infos.ScaleFont(style.Font);
if (!object.ReferenceEquals(newFont, style.Font))
{
style.Font = newFont;
}
}
private struct FlexGridInitInfo
{
public FlexGridInitInfo(int defaultRowSize, int defaultColSize, int topRow, int leftCol)
{
DefaultRowSize = defaultRowSize;
DefaultColSize = defaultColSize;
TopRow = topRow;
LeftCol = leftCol;
}
public int DefaultRowSize;
public int DefaultColSize;
public int TopRow;
public int LeftCol;
}
}
}