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.