Welcome to the Xceed Community | Help
Community Search  
More Search Options

Stack overflow on validations after update to 3.1 from 2

Sort Posts: Previous Next
  •  02-02-2009, 4:36 AM Post no. 18329

    Stack overflow on validations after update to 3.1 from 2

    Hi, I got a stack overflow in the validation after upgrading to 3.1. The validation rule changes the underlying dataset through the cellValidationContext.DataItem, and with this new version every change to this raises the execution of validation rule again, resulting in a stack overflow exception. This behaviour doesn't happen in the 2.0 version of the grid.

    Is there any way of turning off this behaviour, that is, avoid triggering the validation rule when changing the cellValidationContext.DataItem inside the self validation rule?

    Thanks in advance,

     Antonio.

    Filed under: , ,
  •  02-02-2009, 11:45 AM Post no. 18333 in reply to 18329

    Re: Stack overflow on validations after update to 3.1 from 2

    Can you give more details about the exception? Stack Trace, actions to reproduce, details on the data source, anything that can be helpul to trace the issue.
    Marc Laroche
    Software Developer
    Xceed Software Inc.


    I don’t suffer from insanity, I enjoy every minute of it. - Unknown
  •  02-03-2009, 10:53 AM Post no. 18358 in reply to 18333

    Re: Stack overflow on validations after update to 3.1 from 2

    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

     

    Filed under: , ,
View as RSS news feed in XML
Contact | Site Map | Reviews | Legal Terms of Use | Trademarks | Privacy Statement Copyright 2011 Xceed Software Inc.