FlexGrid for WPF
編集データをチェックする
基本操作 > 編集機能 > 編集データをチェックする

C1FlexGridShowErrors プロパティが True に設定されている場合、セルデータを検証できる方法を紹介します。(デフォルト値はTrue)

なお、検証エラーは、いくつかの方法でトリガされます。

  1. データ項目のプロパティセッターが例外をスローした場合は、セルエディタがエラーメッセージを表示し、エラーが修正されるまで、または変更がキャンセルされるまで、エディタはアクティブな状態を維持します。
  2. データ項目が System.ComponentModel.IDataErrorInfo インターフェイスを実装している場合は、デフォルトのインデクサを実装し、列固有のエラーメッセージ(セルエディタにも表示される)を返すことで、項目が列レベルの検証エラーを発生させることができます。または、Error プロパティをエラーメッセージに設定することで、項目レベルの検証エラーをトリガすることもできます。この場合は、いずれかの列固有のエラーとしてではなく、行ヘッダーの最初のセルにアイコンとしてエラーが表示されます。
  3. データ項目が System.ComponentModel.INotifyDataErrorInfo インターフェイスを実装している場合は、上記の列レベルまたは項目レベルの検証エラーを非同期に発生させることができます。System.ComponentModel.INotifyDataErrorInfo は、System.ComponentModel.IDataErrorInfo より複雑で、実装も難しくなります。

【実行例】

 

 下のコードでは、簡単な例外と System.ComponentModel.IDataErrorInfo インターフェイスを使用して、データクラスに検証を実装する方法を示します。下のコードでは、簡単な例外と System.ComponentModel.IDataErrorInfo インターフェイスを使用して、データクラスに検証を実装する方法を示します。また、このコードは製品サンプルのFlexGridSamplesを参考にしてください。

コードのコピー
Public Class Product
    Implements INotifyPropertyChanged
    Implements IEditableObject
    Implements IDataErrorInfo
    ' ** 方法 1:Price が負の値に設定されたときに例外をスローします
    Public Property Price() As System.Nullable(Of Double)
        Get
            Return DirectCast(GetValue("Price"), System.Nullable(Of Double))
        End Get
        Set
            If value <= 0 Then
                Throw New Exception("Price must be greater than zero!")
            End If
            SetValue("Price", value)
        End Set
    End Property

    ' ** 方法 2:特定の列のエラーを返します
    Private Default ReadOnly Property IDataErrorInfo_Item(columnName As String) As String Implements IDataErrorInfo.this
        Get
            Dim msg As String = Nothing
            Select Case columnName
                Case "Cost"
                    If Cost <= 0 Then
                        msg = "Cost must be greater than zero!"
                    End If
                    Exit Select
            End Select
            Return msg
        End Get
    End Property

    ' ** 方法 3:行全体のエラーを返します
    ' (検証は複数の列に基づきます)
    Private ReadOnly Property IDataErrorInfo_Error() As String Implements IDataErrorInfo.[Error]
        Get
            Return If(Price < Cost, "Price must be greater than Cost!", Nothing)
        End Get
    End Property
End Class

コードのコピー
public class Product :
        INotifyPropertyChanged,
        IEditableObject,
        IDataErrorInfo
{
    // ** 方法 1:Price が負の値に設定されたときに例外をスローします
    public double? Price
    {
        get { return (double?)GetValue("Price"); }
        set
        {
            if (value <= 0)
            {
                throw new Exception("Price must be greater than zero!");
            }
            SetValue("Price", value);
        }
    }
   
    // ** 方法 2:特定の列のエラーを返します
    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            string msg = null;
            switch (columnName)
            {
                case "Cost":   
                    if (Cost <= 0)
                    {
                        msg = "Cost must be greater than zero!";
                    }
                    break;
            }
            return msg;
        }
    }
   
    // ** 方法 3:行全体のエラーを返します
    // (検証は複数の列に基づきます)
    string IDataErrorInfo.Error
    {
        get
        {
            return Price < Cost
                ? "Price must be greater than Cost!"
                : null;
        }
    }
}