【連結】 ObjectDataSourceを介しIQueryabale型のデータに連結すると、行挿入後の更新処理でエラーが発生する

文書番号 : 38215     文書種別 : 不具合     登録日 : 2015/03/12     最終更新日 : 2015/03/31
文書を印刷する
対象製品
SPREAD for ASP.NET 7.0J
状況
修正済み
詳細
ObjectDataSourceを介しIQueryabale型のデータに連結すると、行挿入後の更新処理でエラーが発生します。

【再現手順】
1.新規WebフォームにSPREAD、Button2つ、ObjectDataSourceを配置します
2.Webフォームに下記の再現コードを貼り付けます
3.ObjectDataSource用のビジネスオブジェクトとなるTestAClass.vbファイルを用意します
4.TestAClass.vbに下記のコード(TestAClass.vb)を張り付け、プロジェクトに追加します
5. TestAClass.vb のTestAClassをObjectDataSourceのビジネスオブジェクトとして設定します
6.TestAClassが参照するxml、test.xmlを用意しプロジェクトに追加します
7.test.xmlに下記の内容(test.xml)を張り付け、プロジェクトを起動します
8.行を追加ボタン押下後にセルA1で値を選択します
9.保存ボタンを押下します
-- WebForm1_Errorが発生し、ObjectDataSourceのInsertingイベントが発生しません

【再現コード】
------------------------------------
Webフォームクラス
------------------------------------
Imports FarPoint.Web.Spread.Extender

Partial Class Bug10943
  Inherits System.Web.UI.Page

  Private Sub WebForm1_Error(sender As Object, e As EventArgs) Handles Me.Error
    Dim exception = Server.GetLastError()
  End Sub

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

    ' FpSpread1の設定
    FpSpread1.ActiveSheetView.AutoGenerateColumns = False
    FpSpread1.ActiveSheetView.RowCount = 0
    FpSpread1.ActiveSheetView.ColumnCount = 3
    FpSpread1.ActiveSheetView.Columns(0).DataField = "ID"
    FpSpread1.ActiveSheetView.Columns(1).DataField = "A1"
    FpSpread1.ActiveSheetView.Columns(2).DataField = "A2"
    FpSpread1.DataSourceID = "ObjectDataSource1"
    FpSpread1.DataBind()

    Dim ajaxComboBox As AjaxComboBoxCellType = New AjaxComboBoxCellType()
    ajaxComboBox.DropDownStyle = AjaxControlToolkit.ComboBoxStyle.DropDownList
    ajaxComboBox.AutoCompleteMode = AjaxControlToolkit.ComboBoxAutoCompleteMode.SuggestAppend
    ajaxComboBox.Items.Add("1")
    ajaxComboBox.Items.Add("2")
    ajaxComboBox.Items.Add("3")
    FpSpread1.ActiveSheetView.Columns(0).CellType = ajaxComboBox

    Me.Session("filter") = "B1='999'"

    ' Buttonの設定
    Button1.OnClientClick = "TestA();return false;"
    Button1.UseSubmitBehavior = False

    ' Buttonの設定
    Button2.OnClientClick = "TestB();return false;"
    Button2.UseSubmitBehavior = False

    ' 1つのSPREADコントロールは非表示
    FpSpread2.ActiveSheetView.Columns(0).CellType = ajaxComboBox
    FpSpread2.CssClass = "hideSpread"
  End Sub

  Private Sub FpSpread1_InsertCommand(sender As Object, e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.InsertCommand
  End Sub

  Private Sub ObjectDataSource1_Inserting(sender As Object, e As ObjectDataSourceMethodEventArgs) Handles ObjectDataSource1.Inserting
  End Sub

  Private Sub FpSpread1_ErrorCommand(sender As Object, e As FarPoint.Web.Spread.SpreadCommandEventArgs) Handles FpSpread1.ErrorCommand
  End Sub

End Class

------------------------------------
クライアント側スクリプト
------------------------------------
    function TestA() {
      var spreadA = document.getElementById("FpSpread1");
      spreadA.Insert();
    }
    function TestB() {
      var spreadA = document.getElementById("FpSpread1");
      spreadA.UpdatePostbackData();
      spreadA.Update();
    }

------------------------------------
TestAClass.vb
------------------------------------
Imports Microsoft.VisualBasic
Imports System
Imports System.Web
Imports System.Data
Imports System.ComponentModel
Imports System.Linq
Imports System.Data.Linq

Public Class DataClass
  Property ID As Integer
  Property A1 As Integer
  Property A2 As String
End Class

Public Class TestAClass
  Private ds As DataSet = New System.Data.DataSet("testA")
  Private filePath As String = HttpContext.Current.Server.MapPath("test.xml")

  Public Sub New()
    ds.ReadXml(filePath, Data.XmlReadMode.ReadSchema)
  End Sub

  Public Function GetTest2() As IQueryable
    Dim query = From row In ds.Tables("testA").AsEnumerable()
          Select New DataClass With {
            .ID = row.Field(Of Integer)("ID"),
            .A1 = row.Field(Of Integer)("A1"),
            .A2 = row.Field(Of String)("A2")
          }

    Return query.AsQueryable()
  End Function

  Public Sub DeleteTest(ByVal ID As Integer)
    Dim workRow As DataRow = ds.Tables(0).Rows.Find(ID)
    workRow.BeginEdit()
    workRow.Delete()
    workRow.EndEdit()
    ds.WriteXml(filePath, Data.XmlWriteMode.WriteSchema)
  End Sub
  Public Sub UpdateTest(ByVal ID As String, ByVal a1 As Integer, ByVal a2 As Integer)
  End Sub

  Public Sub InsertTest(ByVal ID As Integer, ByVal a1 As Integer, ByVal a2 As String)
  End Sub

  Public Sub InsertTest(ByVal hoge As DataClass)
  End Sub
End Class

------------------------------------
test.xml
------------------------------------
<?xml version="1.0" standalone="yes"?>
<dsTestA>
 <xs:schema id="dsTestA" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="dsTestA" msdata:IsDataSet="true" msdata:Locale="en-US">
   <xs:complexType>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
     <xs:element name="TestA">
      <xs:complexType>
       <xs:sequence>
        <xs:element name="ID" type="xs:int" />
        <xs:element name="A1" type="xs:int" />
        <xs:element name="A2" type="xs:string" />
       </xs:sequence>
      </xs:complexType>
     </xs:element>
    </xs:choice>
   </xs:complexType>
   <xs:unique name="Constraint1" msdata:PrimaryKey="true">
    <xs:selector xpath=".//TestA" />
    <xs:field xpath="ID" />
   </xs:unique>
  </xs:element>
 </xs:schema>
</dsTestA>
回避方法
Service Pack 3(v7.0.4017.2010)で修正済み。