カスタムセルにValidatorを設定しても、ポストバックによって動作しなくなる

文書番号 : 39100     文書種別 : 不具合     登録日 : 2015/09/15     最終更新日 : 2015/10/08
文書を印刷する
対象製品
SPREAD for ASP.NET 8.0J
状況
修正済み
詳細
カスタムセルにValidatorを設定しても、ポストバックによって動作しなくなります。本現象は、SaveViewStateToSessionをFalseにし、LoadPageStateFromPersistenceMedium/SavePageStateFromPersistenceMediumを使用している場合に限り発生します。

【再現手順】
1.新規WebフォームにSPREADひとつ、Buttonコントロールひとつを配置する
2.Webフォームに下記の再現コードを貼り付け、Web フォームを起動する
3.Buttonを押下する
4.A列中にある任意のセルを編集状態にし、何も入力せずに編集を終了する
--- 編集が完了する。(正常動作では、ポストバック後も検証が有効となりメッセージが表示される)

【再現コード】
Partial Class BugSample
  Inherits System.Web.UI.Page

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

    FpSpread1.SaveViewStateToSession = False

    ' CellType
    Dim cTCell As New customTCell()

    ' .NET標準の検証 - RequiredFieldValidatorの作成
    Dim rfValidator As New RequiredFieldValidator()
    rfValidator.ErrorMessage = "値を入力してください"

    'セル型への検証設定
    cTCell.Validators.Add(rfValidator)

    FpSpread1.ActiveSheetView.Columns(0).CellType = cTCell
  End Sub

  Protected Overrides Function LoadPageStateFromPersistenceMedium() As Object
    Dim viewState As Object

    ' 先に取得
    Dim moto As Object = MyBase.LoadPageStateFromPersistenceMedium()

    ' キーをVIewStateから取得
    Dim pair As Pair = DirectCast(moto, Pair)
    Dim key As String = New Guid(DirectCast(pair.Second, String)).ToString()

    ' セッションを取得
    Dim state As Object = Session(key)

    viewState = If((state Is Nothing), moto, state)

    Return viewState
  End Function

  Protected Overrides Sub SavePageStateToPersistenceMedium(viewState As Object)
    Dim key As String = Guid.NewGuid().ToString()
    Session(key) = viewState

    ' keyをViewStateに保存
    MyBase.SavePageStateToPersistenceMedium(New Pair(Nothing, key))
  End Sub
End Class

<Serializable> _
Public Class customTCell
  Inherits FarPoint.Web.Spread.TextCellType
  Implements FarPoint.Web.Spread.Model.ICanSerializeXml

  Public ReadOnly Property CanSerializeXml() As Boolean Implements FarPoint.Web.Spread.Model.ICanSerializeXml.CanSerializeXml
    Get
      Return False
    End Get
  End Property
End Class
回避方法
Service Pack 2(v8.0.4002.2010)で修正済み。
Service Pack 2(v8.0.4002.2010)より前のバージョンでは次の回避方法が有効です。
------------------------------------------

aspxファイルで非表示のTextBoxに対しValidatorを設定し、SPREADのセルにaspxファイルで定義されたValidatorを設定します。

------------------------------------
aspxファイル
------------------------------------
<asp:TextBox ID="TextBox1" runat="server" Visible="False"></asp:TextBox>
<asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="値を入力してください" ControlToValidate="TextBox1"></asp:RequiredFieldValidator>

------------------------------------
Webフォームクラス
------------------------------------
'セル型への検証設定
'cTCell.Validators.Add(rfValidator)
cTCell.Validators.Add(RequiredFieldValidator1)