子階層の列を非表示にして列幅を設定すると例外が発生することがある

文書番号 : 39243     文書種別 : 不具合     登録日 : 2016/01/19     最終更新日 : 2016/02/12
文書を印刷する
対象製品
SPREAD for Windows Forms 7.0J
状況
修正済み
詳細
子階層の列を非表示にして列幅を設定すると、「ウィンドウのハンドルを作成中にエラーが発生しました」というメッセージが表示され、例外が発生することがあります。

【手順】
1.新規フォームにSPREADを配置します
2.下記サンプルコードをコピーし、アプリケーションを実行します
   --例外が発生します

【サンプルコード】
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' データの作成
    Dim r As New Random()
    Dim maxParentRows As Integer = 500
    Dim maxChildRows As Integer = 5
    Dim ds As New DataSet()
    ds.EnforceConstraints = False
    Dim parent As DataTable = ds.Tables.Add("Parent")
    parent.DefaultView.AllowNew = False
    parent.Columns.Add("ParentA", GetType(Int32))
    For i As Integer = 0 To maxParentRows - 1
      parent.Rows.Add(i)
    Next
    Dim child As DataTable = ds.Tables.Add("Child")
    child.DefaultView.AllowNew = False
    child.Columns.Add("ChildA", GetType(Int32))
    For i As Integer = 1 To 9
      child.Columns.Add(String.Format("Child{0}", Chr(65 + i)), GetType([String]))
    Next
    For i As Integer = 0 To maxParentRows - 1
      maxChildRows = r.Next(1, 10)
      For j As Integer = 0 To maxChildRows - 1
        Dim cRow As DataRow = child.NewRow()
        cRow(0) = i
        For k As Integer = 1 To child.Columns.Count - 1
          cRow(k) = String.Format("R{0}C{1}", j, k)
        Next
        child.Rows.Add(cRow)
      Next
    Next
    ds.Relations.Add("PCRelation", parent.Columns("ParentA"), child.Columns("ChildA"))

    ' SPREADの設定
    FpSpread1.ActiveSheet.DataSource = ds.Tables(0)
    FpSpread1.Dock = DockStyle.Fill
    Me.Width = 600

    For i As Integer = 0 To FpSpread1.ActiveSheet.RowCount - 1
      Dim sheet As FarPoint.Win.Spread.SheetView = FpSpread1.ActiveSheet.GetChildView(i, 0)
      For j As Integer = 0 To sheet.ColumnCount - 1
        sheet.Columns(j).Visible = (j Mod 2 = 0)
        sheet.Columns(j).Width = 50
      Next
    Next
  End Sub
回避方法
Service Pack 6(v7.0.2019.2008)で修正済み。
Service Pack 6(v7.0.2019.2008)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

以下のサンプルコードのように、SuspendLayoutおよびResumeLayoutメソッドを使用してレイアウトロジックを停止します。

【サンプルコード】
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' データの作成
    Dim r As New Random()
    Dim maxParentRows As Integer = 500
    Dim maxChildRows As Integer = 5
    Dim ds As New DataSet()
    ds.EnforceConstraints = False
    Dim parent As DataTable = ds.Tables.Add("Parent")
    parent.DefaultView.AllowNew = False
    parent.Columns.Add("ParentA", GetType(Int32))
    For i As Integer = 0 To maxParentRows - 1
      parent.Rows.Add(i)
    Next
    Dim child As DataTable = ds.Tables.Add("Child")
    child.DefaultView.AllowNew = False
    child.Columns.Add("ChildA", GetType(Int32))
    For i As Integer = 1 To 9
      child.Columns.Add(String.Format("Child{0}", Chr(65 + i)), GetType([String]))
    Next
    For i As Integer = 0 To maxParentRows - 1
      maxChildRows = r.Next(1, 10)
      For j As Integer = 0 To maxChildRows - 1
        Dim cRow As DataRow = child.NewRow()
        cRow(0) = i
        For k As Integer = 1 To child.Columns.Count - 1
          cRow(k) = String.Format("R{0}C{1}", j, k)
        Next
        child.Rows.Add(cRow)
      Next
    Next
    ds.Relations.Add("PCRelation", parent.Columns("ParentA"), child.Columns("ChildA"))

    ' SPREADの設定
    FpSpread1.ActiveSheet.DataSource = ds.Tables(0)
    FpSpread1.Dock = DockStyle.Fill
    Me.Width = 600

    FpSpread1.SuspendLayout() ' 回避策[1/2]
    For i As Integer = 0 To FpSpread1.ActiveSheet.RowCount - 1
      Dim sheet As FarPoint.Win.Spread.SheetView = FpSpread1.ActiveSheet.GetChildView(i, 0)
      For j As Integer = 0 To sheet.ColumnCount - 1
        sheet.Columns(j).Visible = (j Mod 2 = 0)
        sheet.Columns(j).Width = 50
      Next
    Next
    FpSpread1.ResumeLayout() ' 回避策[2/2]
  End Sub