リサイズコンポーネントでFlexGridのリサイズ時に発生する問題を回避するリサイズポリシー

文書番号 : 37417     文書種別 : 使用方法     登録日 : 2014/07/16     最終更新日 : 2014/07/16
文書を印刷する
対象製品
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;
    }
  }
}
関連情報