【連結】 ObjectDataSourceを介しIQueryabale型のデータに連結すると、行挿入後の更新処理でエラーが発生する
対象製品
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>
【再現手順】
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)で修正済み。