Hello.
I have previously posted a post.Please refer to the link.
SpreadSheet Cell changed event infinite loop.
I tested it after seeing it was updated and built today.
But I don't know what has changed.
Still, errors and infinite loops appear. (System.StackOverflowException: ''System.StackOverflowException' )
Thanks.
3 Answers, 1 is accepted
This is the test code I made.
ref 2021_1_405 xaml
Windows.Data, Windows.Controls,
Controls.Input, Controls.SpreadSheet, Controls.SpreadSheetUI
Documents.Core, Documents.FormatProviders.OpenXml, Documents.Spreadsheet,
Documents.Spreadsheet.FormatProviders.OpenXml, Documents.Spreadsheet.FormatProviders.Pdf
(Xaml and ViewModel.cs)
<Window x:Class="InfiniteLoop.MainWindow" xmlns:local="clr-namespace:InfiniteLoop" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:Controls="clr-namespace:Telerik.Windows.Controls.Spreadsheet.Controls;assembly=Telerik.Windows.Controls.Spreadsheet" xmlns:Xlsx="clr-namespace:Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml.Xlsx;assembly=Telerik.Windows.Documents.Spreadsheet.FormatProviders.OpenXml" mc:Ignorable="d" Title="MainWindow" Height="450" Width="800"> <Window.DataContext> <local:MainWindowViewModel/> </Window.DataContext> <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="80"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <StackPanel Grid.Column="0"> <Button Content="1. Add!" Height="40" Width="70" Margin="0 10" Command="{Binding OnClickAddSheetCommand}" /> <Button Content="2. Change!" Height="40" Width="70" Command="{Binding OnClickChagneSheetCommand}" /> </StackPanel> <Grid x:Name="spreadsheetLayoutRoot" Grid.Column="1" > <Grid.RowDefinitions> <RowDefinition Height="0"/> <RowDefinition Height="Auto"/> <RowDefinition/> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <Controls:RadSpreadsheetFormulaBar Grid.Row="1" RadSpreadsheet="{Binding ElementName=radSpreadsheet, Mode=OneTime}"/> <telerik:RadSpreadsheet Grid.Row="2" x:Name="radSpreadsheet" Workbook="{Binding ExcelSheet}" AllowDrop="False" IsTabStop="True" > <telerik:EventToCommandBehavior.EventBindings> <telerik:EventBinding EventName="ActiveSheetChanged" Command="{Binding OnActiveSheetChangedCommand}" CommandParameter="{Binding ElementName=radSpreadsheet}" /> </telerik:EventToCommandBehavior.EventBindings> <telerik:RadSpreadsheet.FormatProviders> <Xlsx:XlsxFormatProvider /> </telerik:RadSpreadsheet.FormatProviders> </telerik:RadSpreadsheet> <Controls:RadSpreadsheetStatusBar Grid.Row="3" RadSpreadsheet="{Binding ElementName=radSpreadsheet, Mode=OneTime}" Background="SteelBlue" Foreground="White"/> </Grid> </Grid></Window>using System.Windows.Input;using System.Windows.Media;using Telerik.Windows.Controls;using Telerik.Windows.Documents.Spreadsheet.Model;using Telerik.Windows.Documents.Spreadsheet.PropertySystem;namespace InfiniteLoop{ public class MainWindowViewModel : ViewModelBase { private Workbook _excelSheet = new Workbook(); public Workbook ExcelSheet { get => _excelSheet; set { _excelSheet = value; OnPropertyChanged("ExcelSheet"); } } public ICommand OnClickAddSheetCommand { get; set; } public ICommand OnClickChagneSheetCommand { get; set; } public ICommand OnActiveSheetChangedCommand { get; set; } public MainWindowViewModel() { OnClickAddSheetCommand = new DelegateCommand(OnClickAddSheet); OnClickChagneSheetCommand = new DelegateCommand(OnClickChagneSheet); OnActiveSheetChangedCommand = new DelegateCommand(OnActiveSheetChanged); } private void OnClickAddSheet(object obj) { var workBook = new Workbook(); workBook.Worksheets.Add(); workBook.Worksheets.Add(); workBook.Worksheets.Add(); workBook.Worksheets.Add(); workBook.Worksheets.Add(); foreach (Worksheet sheet in workBook.Sheets) { for (int i = 0; i < 5; i++) { sheet.Cells[0, i].SetValueAsText($"A"); } } ExcelSheet = workBook; } private void OnClickChagneSheet(object obj) { foreach (Worksheet sheet in ExcelSheet.Sheets) { sheet.Cells[0, 1].SetValueAsText(""); sheet.Cells[0, 2].SetValueAsText("1"); sheet.Cells[0, 3].SetValueAsText(""); sheet.Cells[0, 4].SetValueAsText("0"); } } private void OnActiveSheetChanged(object spreadsheet) { var sheet = spreadsheet as RadSpreadsheet; var worksheetEditor = sheet.ActiveWorksheetEditor; if (worksheetEditor != null) { sheet.ActiveWorksheet.Cells.CellPropertyChanged += OnCellPropertyChangedEvent; } } private void OnCellPropertyChangedEvent(object sender, CellPropertyChangedEventArgs e) { CellSelection cell = (sender as Cells)[e.CellRange]; var values = cell.GetValue().Value.RawValue; if (string.IsNullOrEmpty(values)) { //Red cell.SetFill(new PatternFill(PatternType.Solid, Color.FromRgb(255, 0, 0), Colors.Transparent)); } else if (values == "1") { //Yellow cell.SetFill(new PatternFill(PatternType.Solid, Color.FromRgb(255, 231, 0), Colors.Transparent)); } else { cell.ClearFill(); } } }}Hello Kim,
I have reviewed the code you have sent. There is something that grabbed my attention. The event handler of the CellPropertyChanged is changing the fill property, which causes a new CellPropertyChanged event. Then the fill is changed again, and the event is triggered again. This is causing a StackOverflowException.
To correctly implement the event handler, you have to check which property is changed and handle only the Value property events. Here is a sample code showing how to do that:
private void OnCellPropertyChangedEvent(object sender, CellPropertyChangedEventArgs e)
{
if (e.Property == CellPropertyDefinitions.ValueProperty)
{
CellSelection cell = (sender as Cells)[e.CellRange];
string values = cell.GetValue().Value.RawValue;
if (string.IsNullOrEmpty(values))
{
//Red
cell.SetFill(new PatternFill(PatternType.Solid, Color.FromRgb(255, 0, 0), Colors.Transparent));
}
else if (values == "1")
{
//Yellow
cell.SetFill(new PatternFill(PatternType.Solid, Color.FromRgb(255, 231, 0), Colors.Transparent));
}
else
{
cell.ClearFill();
}
}
}
Please let me know if you have any additional questions.
Regards,
Nikolay Demirev
Progress Telerik
Virtual Classroom, the free self-paced technical training that gets you up to speed with Telerik and Kendo UI products, quickly just got a fresh new look + new and improved content, including a brand new Blazor course! Check it out at https://learn.telerik.com/.
Hello.
This works perfectly.
The previous source had "e.Property == CellPropertyDefinitions.ValueProperty", but it changed and overlooked.
Thnak you.
