【クライアント】 クライアント側で検証を設定したセルにSetValueを実行すると、その時点でアクティブなセルにも値が設定される
対象製品
SPREAD for ASP.NET 7.0J
状況
修正済み
詳細
クライアント側での設定したセルに、クライアント側でSetValueを実行すると、その時点でアクティブな別のセルにも値が設定されます。
【再現手順】
1.新規 Web フォーム1および2を用意し、 Webフォーム1にSPREADを配置します
2.下記の再現コードを貼り付け、Web フォーム1を起動します
3.1行目に配置されたボタンを1回押下しあと、2行目に配置されたボタンを素早く2~3回押下します
4.ボタン押下によりWeb フォーム2が起動された後、このフォーム内のボタンを押下します
--- 1列目に"test"という文字列が設定されてるほかに、ボタンにも同じ文字列が設定されます
【再現コード】
---------------------------------
Webフォーム1クラス
---------------------------------
Public Class WebForm1
Inherits System.Web.UI.Page
Implements System.Web.UI.ICallbackEventHandler
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' コールバックの設定
Dim cm As ClientScriptManager = Page.ClientScript
Dim cbReference As [String] = cm.GetCallbackEventReference(Me, "arg", "testOpen", "")
Dim callbackScript As [String] = "function testCallBack(arg, context) {" & cbReference & "; }"
cm.RegisterClientScriptBlock(Me.[GetType](), "testCallBack", callbackScript, True)
If Page.IsPostBack Then
Return
End If
Dim cValidator As New CustomValidator()
cValidator.ID = "customValidatior"
cValidator.ValidateEmptyText = False
cValidator.ClientValidationFunction = "dummyClientValidate"
' 検証関数設定
cValidator.ErrorMessage = "CustomValidatorError"
' 検証を設定したテキスト型セルの設定
Dim tCell As New FarPoint.Web.Spread.TextCellType()
tCell.Validators.Add(cValidator)
FpSpread1.ActiveSheetView.Columns(0).CellType = tCell
' ボタン型セルの設定
Dim bCell1 As New FarPoint.Web.Spread.ButtonCellType()
bCell1.OnClientClick = "test(); return false;"
FpSpread1.ActiveSheetView.Columns(1).CellType = bCell1
' クライアント側でのロック解除を許可
FpSpread1.AllowClientUnlock = True
End Sub
Public Function GetCallbackResult() As String Implements ICallbackEventHandler.GetCallbackResult
Return String.Empty
End Function
Public Sub RaiseCallbackEvent(eventArgument As String) Implements ICallbackEventHandler.RaiseCallbackEvent
System.Threading.Thread.Sleep(2000)
End Sub
End Class
---------------------------------
Webフォーム1 クライアント側スクリプト
---------------------------------
<script type="text/javascript">
function test() {
testCallBack("", "");
}
function testOpen(arg, context) {
var ret = window.showModalDialog('WebForm2.aspx', window, "dialogWidth=100px; dialogHeight=100px; status=no; scroll=no;");
if (ret) {
var spread = document.getElementById("FpSpread1");
var row = spread.GetActiveRow();
spread.SetValue(row, 0, ret, true);
canMove = true;
}
}
function dummyClientValidate(sender, e) {
return;
}
</script>
---------------------------------
Webフォーム2クラス
---------------------------------
Public Class WebForm2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class
---------------------------------
Webフォーム2 クライアント側スクリプト
---------------------------------
<script type="text/javascript">
function ModalClose() {
returnValue = "test";
close();
}
</script>
---------------------------------
Webフォーム2 .aspx
Bodyタグ内に下記を記述してください
---------------------------------
<form id="form1" runat="server">
<div>
<input type="button" id="btnClose" value="値を渡して閉じる" onclick="ModalClose();"/>
</div>
</form>
【再現手順】
1.新規 Web フォーム1および2を用意し、 Webフォーム1にSPREADを配置します
2.下記の再現コードを貼り付け、Web フォーム1を起動します
3.1行目に配置されたボタンを1回押下しあと、2行目に配置されたボタンを素早く2~3回押下します
4.ボタン押下によりWeb フォーム2が起動された後、このフォーム内のボタンを押下します
--- 1列目に"test"という文字列が設定されてるほかに、ボタンにも同じ文字列が設定されます
【再現コード】
---------------------------------
Webフォーム1クラス
---------------------------------
Public Class WebForm1
Inherits System.Web.UI.Page
Implements System.Web.UI.ICallbackEventHandler
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
' コールバックの設定
Dim cm As ClientScriptManager = Page.ClientScript
Dim cbReference As [String] = cm.GetCallbackEventReference(Me, "arg", "testOpen", "")
Dim callbackScript As [String] = "function testCallBack(arg, context) {" & cbReference & "; }"
cm.RegisterClientScriptBlock(Me.[GetType](), "testCallBack", callbackScript, True)
If Page.IsPostBack Then
Return
End If
Dim cValidator As New CustomValidator()
cValidator.ID = "customValidatior"
cValidator.ValidateEmptyText = False
cValidator.ClientValidationFunction = "dummyClientValidate"
' 検証関数設定
cValidator.ErrorMessage = "CustomValidatorError"
' 検証を設定したテキスト型セルの設定
Dim tCell As New FarPoint.Web.Spread.TextCellType()
tCell.Validators.Add(cValidator)
FpSpread1.ActiveSheetView.Columns(0).CellType = tCell
' ボタン型セルの設定
Dim bCell1 As New FarPoint.Web.Spread.ButtonCellType()
bCell1.OnClientClick = "test(); return false;"
FpSpread1.ActiveSheetView.Columns(1).CellType = bCell1
' クライアント側でのロック解除を許可
FpSpread1.AllowClientUnlock = True
End Sub
Public Function GetCallbackResult() As String Implements ICallbackEventHandler.GetCallbackResult
Return String.Empty
End Function
Public Sub RaiseCallbackEvent(eventArgument As String) Implements ICallbackEventHandler.RaiseCallbackEvent
System.Threading.Thread.Sleep(2000)
End Sub
End Class
---------------------------------
Webフォーム1 クライアント側スクリプト
---------------------------------
<script type="text/javascript">
function test() {
testCallBack("", "");
}
function testOpen(arg, context) {
var ret = window.showModalDialog('WebForm2.aspx', window, "dialogWidth=100px; dialogHeight=100px; status=no; scroll=no;");
if (ret) {
var spread = document.getElementById("FpSpread1");
var row = spread.GetActiveRow();
spread.SetValue(row, 0, ret, true);
canMove = true;
}
}
function dummyClientValidate(sender, e) {
return;
}
</script>
---------------------------------
Webフォーム2クラス
---------------------------------
Public Class WebForm2
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
End Class
---------------------------------
Webフォーム2 クライアント側スクリプト
---------------------------------
<script type="text/javascript">
function ModalClose() {
returnValue = "test";
close();
}
</script>
---------------------------------
Webフォーム2 .aspx
Bodyタグ内に下記を記述してください
---------------------------------
<form id="form1" runat="server">
<div>
<input type="button" id="btnClose" value="値を渡して閉じる" onclick="ModalClose();"/>
</div>
</form>
回避方法
Service Pack 3(v7.0.4017.2010)で修正済み。
Service Pack 3(v7.0.4017.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
クライアント側におけるダイアログオープンの際、下記のように強制的にSPREADの編集を終了することで現象を回避することが可能です。
---------------------------------
クライアント側スクリプト
---------------------------------
function testOpen(arg, context) {
var ret = window.showModalDialog('WebForm2.aspx', window, "dialogWidth=100px; dialogHeight=100px; status=no; scroll=no;");
if (ret) {
var spread = document.getElementById("FpSpread1");
// 強制的に編集を終了
spread.EndEdit();
var row = spread.GetActiveRow();
spread.SetValue(row, 0, ret, true);
canMove = true;
}
}
Service Pack 3(v7.0.4017.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------
クライアント側におけるダイアログオープンの際、下記のように強制的にSPREADの編集を終了することで現象を回避することが可能です。
---------------------------------
クライアント側スクリプト
---------------------------------
function testOpen(arg, context) {
var ret = window.showModalDialog('WebForm2.aspx', window, "dialogWidth=100px; dialogHeight=100px; status=no; scroll=no;");
if (ret) {
var spread = document.getElementById("FpSpread1");
// 強制的に編集を終了
spread.EndEdit();
var row = spread.GetActiveRow();
spread.SetValue(row, 0, ret, true);
canMove = true;
}
}