【クライアント】 クライアント側で検証を設定したセルにSetValueを実行すると、その時点でアクティブなセルにも値が設定される

文書番号 : 37619     文書種別 : 不具合     登録日 : 2014/10/10     最終更新日 : 2015/03/31
文書を印刷する
対象製品
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>
回避方法
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;
  }
}