GrapeCity.devlog

グレープシティ株式会社のDeveloper Tools〈開発支援ツール〉の最新情報をお届けします。製品のTIPSや発売情報、イベントのお知らせなどをいち早く発信中です。

SPREAD for WPF 2.0J 新機能紹介(5)- 新しいイベント

WPFの開発で推奨されるMVVMパターンについて、SPREAD for WPF 2.0Jで対応が強化された点を以前の記事で紹介させていただきました。 ただ、実際のところ、MVVMパターンと、コードビハインドでUIイベントを実装したイベントドリブン型の実装との間で悩む開発者の方も少なくないのではないでしょうか。

MVVMのViewとViewModel間のやり取りに、バインディングやコマンドを用いてそれぞれの独立性を維持するよう試みるものの、時にはコードビハインドの簡潔な記述で実現する方法が有効に思える、そういうこともあるようです。開発における多くの課題と同じく、MVVMパターンもケースバイケースで、絶対的な適用方法は存在しないように感じています。

SPREAD for WPF 2.0Jでは、お客様からいただいた多くのご要望を取り入れましたが、UIイベントのリクエストも多くいただきました。2.0Jでは、以下のイベントが追加されています:

イベント 説明
Filteredイベント フィルタリングで発生する
CellValueChangingイベント セル値の変更直前に発生する
CellValueChangedイベント セル値の変更後に発生する

今日はこの中でも、CellValueChangingおよびCellValueChangedイベントをご紹介したいと思います。 ~Changingと~Changedイベントの違いは、~Changingが変更直前に発生し、イベント引数のCancelプロパティで変更をキャンセルできる点です。

セル値の変更には、ユーザーがセルを編集する以外に、以下のような方法があります:

  • コーディングでセル値を変更する
  • ユーザーがセル範囲を選択し[Delete]キーで値をクリア、または[Ctrl]+[X]キーで値をカットする
  • クリップボードから値を貼り付ける
  • 数式が設定されたセルで計算結果が変更される

ユーザーがセルを編集した場合は、編集直前と編集後でCellEditEndingおよびCellEditEndedイベントが発生します。しかし、選択したセル範囲の値が[Delete]キーでクリアされた場合など、セルの編集以外で値が変更された場合、CellEdit~イベントは発生しません。そこで、セルの編集以外でも値が変更されたときに発生するイベントとして、CellValueChangingおよびCellValueChangedイベントが追加されました。

以下、CellValueChangingイベントのサンプルコードです。 このサンプルコードでは、セルの編集以外で値が変更された場合、変更をキャンセルします。

XAML
<sg:GcSpreadGrid x:Name='gcSpreadGrid1' CellValueChanging='gcSpreadGrid1_CellValueChanging'/>
Visual Basic
Private Sub gcSpreadGrid1_CellValueChanging(sender As Object, e As GrapeCity.Windows.SpreadGrid.CellValueChangingEventArgs)
    Dim row As Integer = e.Row, col As Integer = e.Column
    Console.WriteLine(String.Format("セル[{0},{1}]を変更します。", row, col))

    If Not gcSpreadGrid1(e.Row, e.Column).IsEditing Then
        Console.WriteLine(String.Format("「{0}」から「{1}」は編集による変更ではありません、値変更をキャンセルします。", e.OldValue, e.NewValue))
        '値変更をキャンセルします
        e.Cancel = True
    End If
End Sub
C#
private void gcSpreadGrid1_CellValueChanging(object sender, GrapeCity.Windows.SpreadGrid.CellValueChangingEventArgs e)
{
    int row = e.Row, col = e.Column;
    Console.WriteLine(string.Format("セル[{0},{1}]を変更します。", row, col));
            
    if(!gcSpreadGrid1[e.Row, e.Column].IsEditing)
    {
        Console.WriteLine(string.Format("「{0}」から「{1}」は編集による変更ではありません、値変更をキャンセルします。", e.OldValue, e.NewValue));
        //値変更をキャンセルします
        e.Cancel = true;
    }
}

CellValueChangingおよびCellValueChangedイベントについて、詳しくは製品ヘルプ「編集とイベント」もご参考いただければと思います。

Copyright © GrapeCity, Inc. All Rights Reserved.