【データ連結】セルデータの値を変更してもDataRowのRowStateプロパティが更新されません

文書番号 : 33475     文書種別 : 使用方法     登録日 : 2012/11/14     最終更新日 : 2014/09/18
文書を印刷する
対象製品
SPREAD for Windows Forms 7.0J
詳細
Ver2.5J以降ではデータ連結時、セルデータを変更しただけではDataRowのRowStateが更新されず、標準のDataGridViewコントロールと同様、アクティブセルが他の行に移動したタイミングで更新されます。

<注意>
旧バージョン(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


◎サンプルコード(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イベント内での実装