【クライアント】 検証のエラーメッセージにHTMLタグを使用すると、コールバック処理においてエラーが発生する

文書番号 : 37437     文書種別 : 不具合     登録日 : 2014/08/07     最終更新日 : 2015/03/31
文書を印刷する
対象製品
SPREAD for ASP.NET 7.0J
状況
修正済み
詳細
検証でGcTextLengthValidatorのエラーメッセージにHTMLタグを使用すると、コールバック処理においてエラーが発生します。

【再現手順】
1. 新規WebフォームにSpreadを用意し、下記のコードを貼り付けます
2. Webページを起動します
3. セル(0,0)に任意の文字を入力して、Enterキーを押下します
--- クライアント側に設定したデータチェンジイベントによりcallback処理が発生するが、
 その後エラーが発生してデバッグ状態の場合はアプリケーションが停止します
 (リリース実行の場合はスクリプトエラーが発生後、そのまま動き続けます)

※なお、IE11では発生するスクリプトエラーと手順がことなります。

【再現手順】
1. 新規WebフォームにSpreadを用意し、下記のコードを貼り付ける
2. Webページを起動する
3. セル(0,0)に任意の文字を入力して、Enterキーを押下する
4. もう一度セル(0,0)に任意の文字を入力して、Enterキーを押下する
--- Enterキーを押しても編集終了とならず、マウスでほかのセルを選択するとスクリプトエラーになる。

【再現コード】
---------------------------------
クライアント側スクリプト
---------------------------------
  window.onload = init;
  function init() {
    var spread = document.getElementById("FpSpread1");
    if (spread.addEventListener) {
      spread.addEventListener("DataChanged", dc, false);
    } else {
      spread.onDataChanged = dc;
    }
  }
  function dc(e) {
    e = e || window.event;
    var spread = document.getElementById("FpSpread1");
    var row = spread.GetActiveRow();
    spread.UpdatePostbackData();
    spread.CallBack("test," + row);
  }

---------------------------------
Webフォームクラス
---------------------------------
Imports GrapeCity.Web.Input.IMValidators Imports FarPoint.Web.Spread

Public Class WebForm1
  Inherits System.Web.UI.Page

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

    Dim tCell As TextCellType = New TextCellType()
    Dim validator1 As GcTextLengthValidator = New GcTextLengthValidator()

    validator1.ValidateOnInput = True
    validator1.ErrorMessage = "test
test"
    validator1.LengthAsByte = True
    validator1.MaximumLength = 10
    validator1.MinimumLength = 0
    tCell.Validators.Add(validator1)
    FpSpread1.ActiveSheetView.Columns(0).CellType = tCell

  End Sub

  Protected Sub FpSpread1_ButtonCommand(sender As Object, e As SpreadCommandEventArgs) Handles FpSpread1.ButtonCommand
    Dim pos As System.Drawing.Point = e.CommandArgument
     Select e.CommandName
      Case "test"
        FpSpread1.ActiveSheetView.SetValue(pos.X, 1, DateTime.Now.ToString("mm:ss"))
    End Select
  End Sub
End Class
回避方法
Service Pack 3(v7.0.4017.2010)で修正済み。
Service Pack 3(v7.0.4017.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

GcTextLengthValidatorのErrorMessageプロパティを利用する代わりにGcValidatorActionの通知機能を利用します。

---------------------------------
Webフォームクラス
---------------------------------
Imports FarPoint.Web.Spread
Imports GrapeCity.Web.Input.IMExtenders
Imports GrapeCity.Web.Input.IMValidators

Public Class WebForm1
  Inherits System.Web.UI.Page

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

    Dim tCell As TextCellType = New TextCellType()
    Dim validator1 As GcTextLengthValidator = New GcTextLengthValidator()

    ' 【回避策 1/3】GcValidatorActionの生成
    ' ============================================================
    Dim action1 As GcValidatorAction = New GcValidatorAction()
    action1.ID = "action1"
    Dim tip As TipNotify = New TipNotify()
    tip.ToolTipTitle = "入力エラー"
    tip.ToolTipText = "test
test"
    tip.ToolTipSpan = 20000
    action1.DefaultActions.Add(tip)
    Me.Page.Form.Controls.Add(action1)
    ' ============================================================

    validator1.ValidateOnInput = True

    ' 【回避策 2/3】GcTextLengthValidatorでのErrorMessage設定を行わないようにします
    ' validator1.ErrorMessage = "test
test"
    validator1.LengthAsByte = True
    validator1.MaximumLength = 10
    validator1.MinimumLength = 0
    validator1.ValidatorActionID = "action1"

    ' 【回避策 3/3】GcTextLengthValidatorのValidatorに生成したGcValidatorActionを設定します
    tCell.Validators.Add(validator1)
    FpSpread1.ActiveSheetView.Columns(0).CellType = tCell

  End Sub

  Protected Sub FpSpread1_ButtonCommand(sender As Object, e As SpreadCommandEventArgs) Handles FpSpread1.ButtonCommand
    Dim pos As System.Drawing.Point = e.CommandArgument
    Select Case e.CommandName
      Case "test"
        FpSpread1.ActiveSheetView.SetValue(pos.X, 1, DateTime.Now.ToString("mm:ss"))
    End Select
  End Sub
End Class