【クライアント】 検証のエラーメッセージにHTMLタグを使用すると、コールバック処理においてエラーが発生する
対象製品
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
【再現手順】
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
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