【データ連結】セルデータの値を変更してもDataRowのRowStateプロパティが更新されません
対象製品
SPREAD for Windows Forms 7.0J
詳細
Ver2.5J以降ではデータ連結時、セルデータを変更しただけではDataRowのRowStateが更新されず、標準のDataGridViewコントロールと同様、アクティブセルが他の行に移動したタイミングで更新されます。
セルのデータが変更されたタイミングでDataTableを変更(DataRowのRowState を更新)したい場合は、FpSpreadクラスのChange イベント内で該当する行のEndEditメソッドを明示的に呼び出す方法をご検討ください。
◎サンプルコード(VB)
◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
// データの作成
dt = new DataTable("TEST");
dt.Columns.Add("ColumnA", typeof(Int32));
dt.Columns.Add("ColumnB", typeof(Int32));
for (int i = 1; i <= 3; i++)
{
dt.Rows.Add(i, i * 100);
}
dt.AcceptChanges();
fpSpread1.DataSource = dt;
}
void fpSpread1_Change(object sender, FarPoint.Win.Spread.ChangeEventArgs e)
{
Console.WriteLine(dt.Rows[e.Row].RowState.ToString());
dt.Rows[e.Row].EndEdit();
Console.WriteLine(dt.Rows[e.Row].RowState.ToString());
}
<注意>
旧バージョン(Ver1.0J)ではセルデータが変更されたタイミングで自動的にRowStateが更新されますが、Ver2.5J以降では標準的なグリッドコントロールの動作に合わせることを目的に、上記のような仕様変更が行われています。
具体的には.NET Frameworkより提供されるIEditableObject インターフェイス(データソースとして使用されるオブジェクトの変更をコミットまたはロールバックする機能)のサポートを目的としたものです。本インタフェースの詳細についてはMSDNライブラリをご参照ください。
旧バージョン(Ver1.0J)ではセルデータが変更されたタイミングで自動的にRowStateが更新されますが、Ver2.5J以降では標準的なグリッドコントロールの動作に合わせることを目的に、上記のような仕様変更が行われています。
具体的には.NET Frameworkより提供されるIEditableObject インターフェイス(データソースとして使用されるオブジェクトの変更をコミットまたはロールバックする機能)のサポートを目的としたものです。本インタフェースの詳細についてはMSDNライブラリをご参照ください。
セルのデータが変更されたタイミングでDataTableを変更(DataRowのRowState を更新)したい場合は、FpSpreadクラスのChange イベント内で該当する行のEndEditメソッドを明示的に呼び出す方法をご検討ください。
◎サンプルコード(VB)
Private dt As New DataTable
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' データの作成
dt = New DataTable("TEST")
dt.Columns.Add("ColumnA", GetType(Int32))
dt.Columns.Add("ColumnB", GetType(Int32))
For i As Integer = 1 To 3
dt.Rows.Add(i, i * 100)
Next
dt.AcceptChanges()
FpSpread1.DataSource = dt
End Sub
Private Sub FpSpread1_Change(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChangeEventArgs) Handles FpSpread1.Change
Console.WriteLine(dt.Rows(e.Row).RowState.ToString())
dt.Rows(e.Row).EndEdit()
Console.WriteLine(dt.Rows(e.Row).RowState.ToString())
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' データの作成
dt = New DataTable("TEST")
dt.Columns.Add("ColumnA", GetType(Int32))
dt.Columns.Add("ColumnB", GetType(Int32))
For i As Integer = 1 To 3
dt.Rows.Add(i, i * 100)
Next
dt.AcceptChanges()
FpSpread1.DataSource = dt
End Sub
Private Sub FpSpread1_Change(ByVal sender As Object, ByVal e As FarPoint.Win.Spread.ChangeEventArgs) Handles FpSpread1.Change
Console.WriteLine(dt.Rows(e.Row).RowState.ToString())
dt.Rows(e.Row).EndEdit()
Console.WriteLine(dt.Rows(e.Row).RowState.ToString())
End Sub
◎サンプルコード(C#)
private void Form1_Load(object sender, EventArgs e)
{
// データの作成
dt = new DataTable("TEST");
dt.Columns.Add("ColumnA", typeof(Int32));
dt.Columns.Add("ColumnB", typeof(Int32));
for (int i = 1; i <= 3; i++)
{
dt.Rows.Add(i, i * 100);
}
dt.AcceptChanges();
fpSpread1.DataSource = dt;
}
void fpSpread1_Change(object sender, FarPoint.Win.Spread.ChangeEventArgs e)
{
Console.WriteLine(dt.Rows[e.Row].RowState.ToString());
dt.Rows[e.Row].EndEdit();
Console.WriteLine(dt.Rows[e.Row].RowState.ToString());
}
また、以下のタイミングにてEndEditメソッドを呼び出す対応も考えられます。状況に応じて実装してください。DataRowクラス、RowStateプロパティ、およびEndEditメソッドの詳細についてはMSDNライブラリ等をご参照ください。
- フォーム上に配置した標準コマンドボタン押下(全DataRowの一括更新時など)
- セルの編集完了時に発生するFpSpreadクラスのEditModeOffイベント内での実装
- アクティブセルの移動時に発生するFpSpreadクラスのLeaveCellイベント内での実装
- セルの編集完了時に発生するFpSpreadクラスのEditModeOffイベント内での実装
- アクティブセルの移動時に発生するFpSpreadクラスのLeaveCellイベント内での実装