Here you are the code. The highlighted code is the line where the Stack Overflow exception is thrown (because the validation rule executes once and once again when the underlying data is changed) :
public override ValidationResult Validate(object value, CultureInfo cultureInfo, CellValidationContext cellValidationContext)
{
int tmp;
try
{
if (value == null || Convert.ToString(value).Equals(""))
return new ValidationResult(false, "You can not leave this cell empty");
if (!int.TryParse(
value.ToString(),
NumberStyles.Any,
ValidationRules.DefaultCultureInfo,
out tmp)
&&
!value.ToString().Trim().Equals(
""))
return new ValidationResult(false, "It's not an integer number");
// Updating dataset
if (((DataRowView)cellValidationContext.DataItem).Row["id_country"] == DBNull.Value)
return new ValidationResult(true, null);
Double prev_value = Convert.ToDouble(((DataRowView)cellValidationContext.DataItem).Row["patients_randomized"], DefaultCultureInfo);
String id_country = Convert.ToString(((DataRowView)cellValidationContext.DataItem).Row["id_country"]);
if (prev_value == 0)
return new ValidationResult(true, null); // Fix later!!
Double factor = tmp / prev_value;
foreach (System.Data.DataRow dr in ((DataRowView)cellValidationContext.DataItem).DataView.Table.Rows)
{
String tmp_id_country = Convert.ToString(dr["id_country"]);
if (!tmp_id_country.Equals(id_country))
continue;
dr[
"patients_enrolled"] = Convert.ToInt32(Convert.ToDouble(dr["patients_enrolled"], DefaultCultureInfo) * factor);
dr[
"patients_dropout"] = Convert.ToInt32(Convert.ToDouble(dr["patients_dropout"], DefaultCultureInfo) * factor);
dr[
"patients_extension"] = Convert.ToInt32(Convert.ToDouble(dr["patients_extension"], DefaultCultureInfo) * factor);
}
method();
}
catch (Exception ex)
{
return new ValidationResult(false, ex.Message);
}
return new ValidationResult(true, null);
}
}
And here you are the exception info:
- System.StackOverflowException was unhandled
- {Cannot evaluate expression because the current thread is in a stack overflow state.}
And for the last one the call stack:
> GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateScreeningPatientsNew.Validate(object value = 200.0, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2576 + 0x69 bytes C#
[External Code]
GridComponents.dll!GridComponents.ValidationRules.UpdateRandomizedPatientsNew.Validate(object value = 200, System.Globalization.CultureInfo cultureInfo = {System.Globalization.CultureInfo}, Xceed.Wpf.DataGrid.CellValidationContext cellValidationContext = {Xceed.Wpf.DataGrid.CellValidationContext}) Line 2643 + 0x69 bytes C#
[External Code]
I hope this makes sense ;)
Best regards,
Antonio