【スクリプト】固定列の設定を行うとGetSheetColIndex メソッドで正しい値が取得できない

文書番号 : 23880     文書種別 : 不具合     最終更新日 : 2007/05/24
文書を印刷する
対象製品
SPREAD for .NET 2.5J Web Forms Edition
発生環境
動作保証環境と同様
状況
修正済み
詳細
固定列(FrozenColumnCount)の設定を行うと、クライアント側スクリプトのGetSheetColIndex メソッドで正しい値を取得できない場合があります。

【再現手順】
1.新規WebフォームにSPREADとボタンを配置します
2.下記サンプルコードをコピーします
3.ボタンをクリックします
4.GetSheetColIndex(5)の戻り値が「-1」になります

【サンプルコード】
-------------------------
Webフォームクラス
-------------------------
  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Page.IsPostBack Then
      Return
    End If

    FpSpread1.ActiveSheetView.ColumnCount = 10
    FpSpread1.ActiveSheetView.FrozenColumnCount = 5
  End Sub

-------------------------
クライアント側スクリプト
-------------------------
<script language="javascript">
  function cellCheck()
  {
    var spread = document.all("FpSpread1");
    alert(spread.GetSheetColIndex(5));
  }
</script>

------------------------------------
HTML
 ※スクリプトテスト用のHTMLボタン
------------------------------------
<INPUT style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 8px" type="button" value="Button" onclick="cellCheck();">
回避方法
2007/09/05版で修正済み。

2007/09/05版より前のバージョンでは次の回避方法が有効です。

下記のサンプルコードのように、サーバー側で非表示列の情報をクライアント側に送信し、その情報を元にクライアント側でサーバー側の列インデックスを取得します。

【サンプルコード】
------------------------------------
Webフォームクラス
------------------------------------
  Private hiddencols As String

  Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    If Page.IsPostBack Then
      Return
    End If

    FpSpread1.ActiveSheetView.ColumnCount = 10

    FpSpread1.ActiveSheetView.Columns(3).Visible = False
    FpSpread1.ActiveSheetView.Columns(6).Visible = False

    FpSpread1.ActiveSheetView.FrozenColumnCount = 3
  End Sub

  Private Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.PreRender
    Dim i As Integer

    '非表示列の情報を作成します
    hiddencols = ""
    For i = 0 To FpSpread1.ActiveSheetView.ColumnCount - 1
      hiddencols += Convert.ToInt32(FpSpread1.ActiveSheetView.GetColumnVisible(i)).ToString + ","
    Next

    Dim Script As String = "" 'スクリプト文
    Script += "<script Language='javascript'>" + vbNewLine
    Script += "var hiddencols;" + vbNewLine
    Script += "hiddencols = """ + hiddencols + """;" + vbNewLine

    'cellCheck:表示されている全ての列で対応するサーバー側の列インデックスをアラートで表示します
    Script += "function cellCheck()" + vbNewLine
    Script += "{" + vbNewLine
    Script += "var spread = document.all(""FpSpread1"");" + vbNewLine
    Script += "var colcount = spread.GetColCount();" + vbNewLine
    Script += "for (var i=0; i<colcount; i++)" + vbNewLine
    Script += "{" + vbNewLine
    Script += "var col = GetColIndex(i);" + vbNewLine
    Script += "alert(i + ""→"" + col);" + vbNewLine
    Script += "}" + vbNewLine
    Script += "}" + vbNewLine

    'GetColIndex:表示上の指定した列に対応するサーバー側の列インデックスを取得します
    Script += "function GetColIndex(col)" + vbNewLine
    Script += "{" + vbNewLine
    Script += "var c = col;" + vbNewLine
    Script += "var s;" + vbNewLine
    Script += "var i = 0;" + vbNewLine
    Script += "var hiddens=0;" + vbNewLine
    Script += "s = hiddencols.split("","");" + vbNewLine
    Script += "//指定列までの間の非表示列の数をカウントします" + vbNewLine
    Script += "while(i <= col + hiddens)" + vbNewLine
    Script += "{" + vbNewLine
    Script += "if (s[i] == ""0"")" + vbNewLine
    Script += "{" + vbNewLine
    Script += "hiddens++;" + vbNewLine
    Script += "}" + vbNewLine
    Script += "i++;" + vbNewLine
    Script += "}" + vbNewLine
    Script += "c = c + hiddens;" + vbNewLine
    Script += "return c;" + vbNewLine
    Script += "}" + vbNewLine

    Script += "</script>" + vbNewLine

    '現在ページの先頭行と非表示行/列の情報をクライアント側ページに書き込みます
    RegisterClientScriptBlock("client", Script)
  End Sub

------------------------------------
HTML
 ※スクリプトテスト用のHTMLボタン
------------------------------------
<INPUT style="Z-INDEX: 102; LEFT: 16px; POSITION: absolute; TOP: 8px" type="button" value="Button" onclick="cellCheck();">
キーワード
SPRN06218

この文書は、以前は次のバグレポートIDで公開されていました : 6953