Laden...

ValidationRule

Letzter Beitrag vor einem Jahr 2 Posts 569 Views
ValidationRule

Für den dynamischen Inhalt eines Datagrid habe ich eine ValidationRule geschrieben:

        public override ValidationResult Validate(object value,
            System.Globalization.CultureInfo cultureInfo)
        {
            var bg = (BindingGroup)value;
            DataRowView rView = bg.Items[0] as DataRowView;

            if (Columns != null)
            {
                bool result = true;
                foreach (string name in Columns.Keys)
                {
                    object iValue = DBNull.Value;
                    if (result)
                    {
                        bool isDirty = bg.IsDirty;
                        bool isSealed = bg.IsSealed;
                        result = bg.TryGetValue(rView, name, out iValue);
                    }
                    if (!result)
                        return new ValidationResult(false, $"Propertie \"{Columns[name].ColumnHeader}\" not found!");
                    else if (iValue == DBNull.Value)
                        return new ValidationResult(false, $"\"{Columns[name].ColumnHeader}\" is necessary!");
                    else
                    {
                        switch (Columns[name].DataType)
                        {
                            case ApClasses.EnumDataType.NVarChar100:
                            case ApClasses.EnumDataType.Bit:
                                if (iValue.ToString().Trim().Length == 0)
                                    return new ValidationResult(false, $"\"{Columns[name].ColumnHeader}\" should be at least 1 char!");
                                break;
                            case ApClasses.EnumDataType.BigInt:
                            case ApClasses.EnumDataType.Int:
                                if (!ApClasses.ApUtilities.ConvToInt(iValue).ToString().Equals(iValue.ToString()))
                                    return new ValidationResult(false, $"\"{Columns[name].ColumnHeader}\" should be an integer!");
                                break;
                            case ApClasses.EnumDataType.Float:
                                if (!ApClasses.ApUtilities.ConvToFloat(iValue).ToString().Equals(iValue.ToString()))
                                    return new ValidationResult(false, $"\"{Columns[name].ColumnHeader}\" should be an float!");
                                break;
                            case ApClasses.EnumDataType.DateTime2:
                                if (!ApClasses.ApUtilities.ConvToDate(iValue).ToString().Equals(iValue.ToString()))
                                    return new ValidationResult(false, $"\"{Columns[name].ColumnHeader}\" should be an TimeStamp!");
                                break;
                        }
                    }
                }
            }
            return ValidationResult.ValidResult;
        }
    }

Diese funktioniert im Prinzip. Jedoch bekomme ich sporadisch falsche Validierungsergebnisse. "bg.TryGetValue(rView, name, out iValue);" liefert false, obwohl im DataRowView der name="ValueIn01" enthalten ist. Hier ist die exportierte DataRowView.

ID;ID_Equipments;ID_Parameterization;ValueIn00;ValueIn01
18;1;1;38000;4

Das Dictionary<string, ApValueMapping> Columns ist immer korrekt gefüllt. Hier zm besseren Verständnis noch das ApValueMapping:


public class ApValueMapping
{
    public string? ColumnHeader { get; set; }
    public EnumDataType DataType { get; set; }

    public ApValueMapping(string columnHeader, EnumDataType dataType)
    {
        ColumnHeader = columnHeader;
        DataType = dataType;
    }
}

Gibt es bei Euch schon Erfahrungen in dieser Richtung?

Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.

Ergänzung: Wenn ich alle Spalteneiner Row ändere, funktioniert es. Angemeckert werden die nicht editierten Spalten.

Und wirst du älter als ´ne Kuh,
musst doch lernen immerzu.