カスタムセルにValidatorを設定しても、ポストバックによって動作しなくなる
対象製品
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
【再現手順】
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)
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)