How to reproduce:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.radGridView1.DataSource = this.GetData();
GridViewComboBoxColumn supplierColumn = new GridViewComboBoxColumn();
supplierColumn.Name = "SupplierColumn";
supplierColumn.HeaderText = "Supplier";
supplierColumn.DataSource = this.GetListItemData(); ;
supplierColumn.ValueMember = "Id";
supplierColumn.DisplayMember = "Description";
supplierColumn.Width = 200;
this.radGridView1.Columns.Add(supplierColumn);
this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.CellEditorInitialized += RadGridView1_CellEditorInitialized;
}
private void RadGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
{
RadDropDownListEditor editor = e.ActiveEditor as RadDropDownListEditor;
if (editor == null)
{
return;
}
RadDropDownListEditorElement element = (RadDropDownListEditorElement)editor.EditorElement;
element.ValueChanging -= Element_ValueChanging;
element.ValueChanging += Element_ValueChanging;
}
private void Element_ValueChanging(object sender, ValueChangingEventArgs e)
{
Console.WriteLine("ValueChanging");
Console.WriteLine("Old " + e.OldValue);
Console.WriteLine("New " + e.NewValue);
}
private object GetData()
{
DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Date", typeof(DateTime));
for (int i = 0; i < 100; i++)
{
dt.Rows.Add(i, "Name " + i, DateTime.Now.AddDays(i));
}
return dt;
}
public List<Item> GetListItemData()
{
List<Item> items = new List<Item>();
for (int i = 0; i < 10; i++)
{
items.Add(new Item(i, "Data" + i, DateTime.Now.AddDays(i).AddHours(i)));
}
return items;
}
}
public class Item
{
public int Id { get; set; }
public string Description { get; set; }
public DateTime Date { get; set; }
public Item(int id, string description, DateTime date)
{
this.Id = id;
this.Description = description;
this.Date = date;
}
}
Workaround: handle the TextChanging event and store locally the old value
private void RadGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
{
RadDropDownListEditor editor = e.ActiveEditor as RadDropDownListEditor;
if (editor == null)
{
return;
}
RadDropDownListEditorElement element = (RadDropDownListEditorElement)editor.EditorElement;
element.TextChanging-= Element_TextChanging;
element.TextChanging += Element_TextChanging;
element.ValueChanging -= Element_ValueChanging;
element.ValueChanging += Element_ValueChanging;
}
object oldValue;
private void Element_TextChanging(object sender, TextChangingEventArgs e)
{
oldValue = e.OldValue;
}
private void Element_ValueChanging(object sender, ValueChangingEventArgs e)
{
Console.WriteLine("ValueChanging");
Console.WriteLine("Old " + oldValue);
Console.WriteLine("New " + e.NewValue);
}
Until released one can format the nodes this way:
private void RadGridView1_FilterPopupRequired(object sender, Telerik.WinControls.UI.FilterPopupRequiredEventArgs e)
{
if (e.Column.GetType().Name == "GridViewDateTimeColumn")
{
RadListFilterPopup popup = new RadListFilterPopup(e.Column, true);
e.FilterPopup = popup;
popup.MenuTreeElement.TreeView.NodeFormatting += TreeView_NodeFormatting;
}
}
int monthNumber = -1;
private void TreeView_NodeFormatting(object sender, TreeNodeFormattingEventArgs e)
{
if (e.Node.Level == 2)
{
if (int.TryParse(e.Node.Text, out monthNumber))
{
e.NodeElement.ContentElement.Text = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(monthNumber);
}
}
}
How to reproduce
public partial class Form1 : RadForm
{
public Form1()
{
InitializeComponent();
GridViewTextBoxColumn textBoxColumn = new GridViewTextBoxColumn();
textBoxColumn.Name = "Column";
textBoxColumn.HeaderText = "Column";
this.radGridView1.MasterTemplate.Columns.Add(textBoxColumn);
GridViewTextBoxColumn textBoxColumn2 = new GridViewTextBoxColumn();
textBoxColumn2.Name = "TextBoxColumn2";
textBoxColumn2.HeaderText = "ReadOnlyColumn";
this.radGridView1.MasterTemplate.Columns.Add(textBoxColumn2);
for (int i = 0; i < 10; i++)
{
object v = i * 2;
if (i % 3 == 0)
{
v = null;
}
this.radGridView1.Rows.Add(new object[] { i, v });
}
this.radGridView1.MultiSelect = true;
foreach (var row in this.radGridView1.Rows)
{
foreach (var cell in row.Cells)
{
GridViewCellInfo cellInfo = cell as GridViewCellInfo;
if (cellInfo != null && cellInfo.RowInfo.Index % 3 == 0 && cellInfo.ColumnInfo.Index == 1)
{
cellInfo.ReadOnly = true;
}
}
}
}
}
Workaround:
public class MyRadGridView : RadGridView
{
public override string ThemeClassName
{
get
{
return typeof(RadGridView).FullName;
}
}
protected override RadGridViewElement CreateGridViewElement()
{
return new MyRadGridViewElement();
}
}
internal class MyRadGridViewElement : RadGridViewElement
{
protected override Type ThemeEffectiveType
{
get
{
return typeof(RadGridViewElement);
}
}
protected override MasterGridViewTemplate CreateTemplate()
{
return new MyMasterGridViewTemplate();
}
}
internal class MyMasterGridViewTemplate : MasterGridViewTemplate
{
protected override void PasteDataToRow(List<string> rowData, GridViewRowInfo row)
{
{
int colIndex = this.Owner.CurrentColumn.Index;
int j = 0;
while (j < rowData.Count && colIndex < this.CurrentView.ViewTemplate.ColumnCount)
{
GridViewColumn col = this.CurrentView.ViewTemplate.Columns[colIndex];
if (col.IsVisible && !col.ReadOnly && !row.Cells[colIndex].ReadOnly)
{
object value = rowData[j];
if (string.IsNullOrEmpty(rowData[j]))
{
value = null;
}
else if (this.CurrentView.ViewTemplate.Columns[colIndex].DataType == typeof(string))
{
GridViewTextBoxColumn textColumn = col as GridViewTextBoxColumn;
if (textColumn != null && textColumn.MaxLength > 0)
{
if (rowData[j].Length > textColumn.MaxLength)
{
value = rowData[j].Substring(0, textColumn.MaxLength);
}
}
}
else if (this.CurrentView.ViewTemplate.Columns[colIndex].DataType == typeof(DateTime))
{
try
{
value = DateTime.Parse(rowData[j], this.CurrentView.ViewTemplate.Columns[colIndex].FormatInfo);
}
catch { }
}
else if (this.CurrentView.ViewTemplate.Columns[colIndex].DataType == typeof(Color))
{
try
{
value = ColorTranslator.FromHtml(rowData[j]);
}
catch { }
}
if (this.ClipboardPasteMode == GridViewClipboardPasteMode.EnableWithNotifications)
{
CellValidatingEventArgs cellValidating = new CellValidatingEventArgs(row, col, value, row.Cells[colIndex].Value, null);
this.EventDispatcher.RaiseEvent<CellValidatingEventArgs>(EventDispatcher.CellValidating, this, cellValidating);
if (!cellValidating.Cancel)
{
row.Cells[colIndex].Value = value;
CellValidatedEventArgs cellValidated = new CellValidatedEventArgs(row, col, value);
this.EventDispatcher.RaiseEvent<CellValidatedEventArgs>(EventDispatcher.CellValidated, this, cellValidated);
}
}
else
{
row.Cells[colIndex].Value = value;
}
j++;
}
colIndex++;
}
}
}
}
By default, when I am expanding a group and start sorting, the expanded group doesn't collapse. However, if you use a group comparer, all groups will always collapse, when you click a header cell to sort.
To reproduce: we have a RadPageView with two grids on two pages. The first grid has a ColumnGroupsViewDefinition applied. When you open the Property Builder and try to hide some of the columns, the error occurs. Workaround: make the changes programamtically at run time.
How to reproduce: check the attached project
Workaround: create a custom RadListFilterPopup
public class MyRadListFilterPopup : RadListFilterPopup
{
public MyRadListFilterPopup(GridViewDataColumn dataColumn, bool groupedDateValues)
: base(dataColumn, groupedDateValues)
{ }
protected override void OnButtonOkClick(EventArgs e)
{
FilterOperator filterOperator = FilterOperator.IsEqualTo;
IRadListFilterElement listFilterElement = (IRadListFilterElement)typeof(RadListFilterPopup).GetField("listFilterElement", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this);
RadListFilterDistinctValuesTable selectedValues = listFilterElement.SelectedValues;
switch (listFilterElement.SelectedMode)
{
case ListFilterSelectedMode.All:
filterOperator = FilterOperator.None;
break;
case ListFilterSelectedMode.Null:
filterOperator = FilterOperator.IsNull;
break;
case ListFilterSelectedMode.NotNull:
filterOperator = FilterOperator.IsNotNull;
break;
}
if (filterOperator != FilterOperator.IsEqualTo)
{
SetFilterOperator(filterOperator);
this.ClosePopup(RadPopupCloseReason.CloseCalled);
}
else
{
CompositeFilterDescriptor compositeFilterDescriptor = new CompositeFilterDescriptor();
compositeFilterDescriptor.PropertyName = this.DataColumn.Name;
RadListFilterDistinctValuesTable distinctValues = this.GetDistinctValuesTable();
string blanksKey = RadGridLocalizationProvider.CurrentProvider.GetLocalizedString(RadGridStringId.FilterMenuBlanks);
bool blanks = selectedValues.Contains(blanksKey);
if (selectedValues.Count > distinctValues.Count / 2 && !blanks)
{
compositeFilterDescriptor.LogicalOperator = FilterLogicalOperator.And;
foreach (DictionaryEntry entry in distinctValues)
{
string key = (string)entry.Key;
if (string.IsNullOrEmpty(key))
{
key = blanksKey;
}
if (!selectedValues.Contains(key))
{
foreach (object value in (ArrayList)entry.Value)
{
FilterDescriptor descriptor;
if (value == DBNull.Value)
{
descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, null);
}
else if (this.DataColumn is GridViewDateTimeColumn || this.DataColumn.DataType == typeof(DateTime) || this.DataColumn.DataType == typeof(DateTime?))
{
descriptor = new DateFilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, (DateTime?)value, false);
}
else
{
descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, value);
}
compositeFilterDescriptor.FilterDescriptors.Add(descriptor);
}
}
}
}
else
{
compositeFilterDescriptor.LogicalOperator = FilterLogicalOperator.Or;
foreach (DictionaryEntry entry in selectedValues)
{
foreach (object value in (ArrayList)entry.Value)
{
FilterDescriptor descriptor;
if (value == DBNull.Value)
{
descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsNotEqualTo, null);
}
else if (this.DataColumn is GridViewDateTimeColumn || this.DataColumn.DataType == typeof(DateTime) || this.DataColumn.DataType == typeof(DateTime?))
{
descriptor = new DateFilterDescriptor(this.DataColumn.Name, FilterOperator.IsEqualTo, (DateTime?)value, false);
}
else
{
descriptor = new FilterDescriptor(this.DataColumn.Name, FilterOperator.IsEqualTo, value);
}
compositeFilterDescriptor.FilterDescriptors.Add(descriptor);
}
}
}
this.FilterDescriptor = compositeFilterDescriptor;
OnFilterConfirmed();
}
}
}
This new API will be useful for implementing custom sorting scenarios when you need to have custom sorting only for a single column. A similar API is available for the filtering functionality (MasterTemplate.DataView.FilterEvaluate)
How to reproduce: check the code snippet below and the attached video.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.SetupGrid();
this.radGridView1.Dock = DockStyle.Fill;
this.radGridView1.UseScrollbarsInHierarchy = true;
}
private void SetupGrid()
{
BindingList<Teacher> teachers = new BindingList<Teacher>();
BindingList<Student> students = new BindingList<Student>();
for (int i = 1; i <= 2; i++)
{
teachers.Add(new Teacher
{
TeacherId = i,
TeacherFirstName = "FirstName " + i,
TeacherLastName = "FirstName " + i,
});
for (int j = 1; j <= 3; j++)
{
students.Add(new Student
{
SudentId = j,
TeacherId = i,
SudentFirstName = "Student " + j,
SudentLastName = "LastName " + j,
});
}
}
this.radGridView1.Templates.Clear();
this.radGridView1.DataSource = null;
this.radGridView1.DataSource = teachers;
this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
GridViewTemplate template = new GridViewTemplate();
template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
template.DataSource = students;
this.radGridView1.MasterTemplate.Templates.Add(template);
GridViewRelation relation = new GridViewRelation(radGridView1.MasterTemplate);
relation.ChildTemplate = template;
relation.RelationName = "TeacherStudents";
relation.ParentColumnNames.Add("TeacherId");
relation.ChildColumnNames.Add("TeacherId");
this.radGridView1.Relations.Add(relation);
this.radGridView1.ChildViewExpanded += RadGridView1_ChildViewExpanded1;
}
private void RadGridView1_ChildViewExpanded1(object sender, ChildViewExpandedEventArgs e)
{
}
private void radButton1_Click(object sender, EventArgs e)
{
this.radGridView1.SaveLayout("..\\..\\save.xml");
}
private void radButton2_Click(object sender, EventArgs e)
{
this.radGridView1.LoadLayout("..\\..\\save.xml");
}
}
public class Teacher
{
public int TeacherId { get; set; }
public string TeacherFirstName { get; set; }
public string TeacherLastName { get; set; }
}
public class Student
{
public int SudentId { get; set; }
public int TeacherId { get; set; }
public string SudentFirstName { get; set; }
public string SudentLastName { get; set; }
}
Workaround: prevent the child templates from serializing
public class MyRadGridView : RadGridView
{
public override string ThemeClassName
{
get
{
return typeof(RadGridView).FullName;
}
}
public override void SaveLayout(string fileName)
{
MyGridViewLayoutSerializer ser = new MyGridViewLayoutSerializer(this.XmlSerializationInfo);
using (XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.UTF8))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartElement("RadGridView");
ser.WriteObjectElement(writer, this);
}
}
}
public class MyGridViewLayoutSerializer : GridViewLayoutSerializer
{
public MyGridViewLayoutSerializer(ComponentXmlSerializationInfo componentSerializationInfo)
: base(componentSerializationInfo)
{ }
protected override bool ShouldSerializeValue(object component, PropertyDescriptor property, PropertySerializationMetadata overwriteMetadata)
{
if (property.Name == "Templates")
{
return false;
}
return base.ShouldSerializeValue(component, property, overwriteMetadata);
}
}
To reproduce:
Sub New()
InitializeComponent()
Dim dt As New DataTable
dt.Columns.Add("Id", GetType(Integer))
dt.Columns.Add("Name", GetType(String))
For index = 1 To 1000
dt.Rows.Add(index, "Item" & index)
Next
Me.RadGridView1.DataSource = dt
End Sub
Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click
Dim pdfFile As String = "..\..\exportedFile.pdf"
Dim pdfExporter As New GridViewPdfExport(Me.RadGridView1)
pdfExporter.ShowHeaderAndFooter = True
pdfExporter.FitToPageWidth = True
AddHandler pdfExporter.PdfExported, AddressOf pdfExporter_PdfExported
Dim renderer As New PdfExportRenderer()
pdfExporter.RunExport(pdfFile, renderer)
Process.Start(pdfFile)
End Sub
Private Sub pdfExporter_PdfExported(sender As Object, e As System.EventArgs)
Dim pdfFile As String = "..\..\exportedFile.pdf"
Dim document As RadFixedDocument
Dim provider As Telerik.Windows.Documents.Fixed.FormatProviders.Pdf.PdfFormatProvider = New Telerik.Windows.Documents.Fixed.FormatProviders.Pdf.PdfFormatProvider()
Using stream As Stream = File.OpenRead(pdfFile)
document = provider.Import(stream) '<==== Error Found
For Each page As RadFixedPage In document.Pages
Dim editor As FixedContentEditor = New FixedContentEditor(page)
editor.Position.Translate(page.Size.Width / 2, page.Size.Height - 50)
Dim pageNum As Integer = document.Pages.IndexOf(page) + 1
editor.DrawText(pageNum + " of " + document.Pages.Count)
Next
End Using
Using output As Stream = File.OpenWrite(pdfFile)
provider.Export(document, output) '<==== Error Found
End Using
Process.Start(pdfFile)
End Sub
Workaround: use the PdfExportRenderer.PdfExporting event where you have access to the document and you can make any customizations to it:
Dim pdfFile As String = "..\..\exportedFile.pdf"
Dim pdfExporter As New GridViewPdfExport(Me.RadGridView1)
pdfExporter.ShowHeaderAndFooter = True
pdfExporter.FitToPageWidth = True
Dim renderer As New PdfExportRenderer()
AddHandler renderer.PdfExporting, AddressOf PdfExporting
pdfExporter.RunExport(pdfFile, renderer)
Private Sub PdfExporting(sender As Object, e As PdfExportingEventArgs)
Dim document As RadFixedDocument = e.Document
Dim provider As Telerik.Windows.Documents.Fixed.FormatProviders.Pdf.PdfFormatProvider = New Telerik.Windows.Documents.Fixed.FormatProviders.Pdf.PdfFormatProvider()
For Each page As RadFixedPage In document.Pages
Dim editor As FixedContentEditor = New FixedContentEditor(page)
editor.Position.Translate(page.Size.Width / 2, page.Size.Height - 50)
Dim pageNum As Integer = document.Pages.IndexOf(page) + 1
editor.DrawText(pageNum & " of " & document.Pages.Count)
Next
End Sub
I have a GridView (Winforms v. 2017.3.1017.40, same problem with 2017.2.502.40) configured as on the attached screenshot (made some groups, made a search, and used the "excel-like" filter on a column to uncheck some values). Then I try to click on some column headers to sort the grid. After a few clicks, I get this error : InvalidOperationException: La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter. I got different stacktrace with the same error : InvalidOperationException: La collection a été modifiée ; l'opération d'énumération peut ne pas s'exécuter. at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at System.Collections.Generic.List`1.Enumerator.MoveNext() at Telerik.WinControls.UI.DataGroup.<GetEnumerator>d__0.MoveNext() at Telerik.WinControls.UI.GridViewGroupRowInfo.get_ChildRows() at Telerik.WinControls.UI.GridViewRowInfo.HasChildRows() at Telerik.WinControls.UI.PrintGridTraverser.CanStepInHierarchy() at Telerik.WinControls.UI.GridTraverser.StepInHierarchy() at Telerik.WinControls.UI.GridTraverser.MoveNextCore() at Telerik.WinControls.UI.GridTraverser.MoveNext() at Telerik.WinControls.UI.GridViewSearchRowInfo.worker_DoWork(Object sender, DoWorkEventArgs e) at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e) at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument) ----- InvalidOperationException: Failed to compare two elements in the array. ---> NullReferenceException: Object reference not set to an instance of an object. at Telerik.WinControls.UI.GridViewRowInfoComparer.CompareRows(GridViewRowInfo x, GridViewRowInfo y, SortDescriptorCollection context) at System.Collections.Generic.ArraySortHelper`1.InternalBinarySearch(T[] array, Int32 index, Int32 length, T value, IComparer`1 comparer) at System.Collections.Generic.ArraySortHelper`1.BinarySearch(T[] array, Int32 index, Int32 length, T value, IComparer`1 comparer) --- End of inner exception stack trace --- at System.Collections.Generic.ArraySortHelper`1.BinarySearch(T[] array, Int32 index, Int32 length, T value, IComparer`1 comparer) at System.Collections.Generic.List`1.BinarySearch(Int32 index, Int32 count, T item, IComparer`1 comparer) at Telerik.Collections.Generic.HybridIndex`1.PerformWithQuickSort() at Telerik.Collections.Generic.HybridIndex`1.get_Items() at Telerik.Collections.Generic.Index`1.GetEnumerator() at Telerik.WinControls.Data.GroupBuilder`1.Perform(IReadOnlyCollection`1 items, Int32 level, Group`1 parent) at Telerik.WinControls.Data.GroupBuilder`1.get_Groups() at Telerik.WinControls.UI.GridViewInfo.Refresh() at Telerik.WinControls.UI.GridViewInfo.get_ChildRows() at Telerik.WinControls.UI.ViewInfoTraverser.SetCollectionForStage(Boolean initializeCollection) at Telerik.WinControls.UI.ViewInfoTraverser.ChangeCollectionForward() at Telerik.WinControls.UI.ViewInfoTraverser.MoveNextCore() at Telerik.WinControls.UI.ViewInfoTraverser.MoveNext() at Telerik.WinControls.UI.GridTraverser.MoveNextCore() at Telerik.WinControls.UI.GridTraverser.MoveNext() at Telerik.WinControls.UI.BaseGridNavigator.NavigateToRow(GridViewRowInfo row, Boolean select) at Telerik.WinControls.UI.BaseGridNavigator.ProcessViewChangedEvent(GridViewEvent eventData) at Telerik.WinControls.UI.BaseGridNavigator.ProcessEventCore(GridViewEvent eventData) at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessCollection(GridViewEvent gridEvent, PriorityWeakReferenceList list, GridEventProcessMode processMode) at Telerik.WinControls.UI.GridViewEventProcessEntity.ProcessEvent(GridViewEvent gridEvent) at Telerik.WinControls.UI.GridViewSynchronizationService.NotifyListeners(GridViewEvent gridEvent) at Telerik.WinControls.UI.GridViewSynchronizationService.FlushEvents() at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewEvent gridEvent) at Telerik.WinControls.UI.GridViewSynchronizationService.DispatchEvent(GridViewTemplate template, GridViewEvent eventData, Boolean postUI) at Telerik.WinControls.UI.GridViewTemplate.DispatchDataViewChangedEvent(Object sender, DataViewChangedEventArgs args) at Telerik.WinControls.UI.GridViewTemplate.OnViewChanged(Object sender, DataViewChangedEventArgs e) at Telerik.WinControls.UI.MasterGridViewTemplate.OnViewChanged(Object sender, DataViewChangedEventArgs e) at Telerik.WinControls.Data.RadDataView`1.RebuildData(Boolean notify) at Telerik.WinControls.Data.RadDataView`1.OnNotifyPropertyChanged(PropertyChangedEventArgs e) at Telerik.WinControls.Data.RadCollectionView`1.OnNotifyPropertyChanged(String propertyName) at Telerik.WinControls.UI.GridViewSortDescriptorCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs args) at System.ComponentModel.PropertyChangedEventHandler.Invoke(Object sender, PropertyChangedEventArgs e) at Telerik.WinControls.Data.SortDescriptor.set_Direction(ListSortDirection value) at Telerik.WinControls.UI.GridViewColumn.Sort(RadSortOrder sortOrder, Boolean multiSortMode) at Telerik.WinControls.UI.GridHeaderCellElement.Sort(RadSortOrder sortOrder) at Telerik.WinControls.UI.GridHeaderRowBehavior.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.UI.BaseGridBehavior.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.UI.RadGridView.OnMouseUp(MouseEventArgs e) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at Telerik.WinControls.RadControl.WndProc(Message& m) at Telerik.WinControls.UI.RadGridView.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ------ InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource) at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at System.Collections.Generic.List`1.Enumerator.MoveNext() at Telerik.WinControls.UI.DataGroup.<GetEnumerator>d__0.MoveNext() [...] at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at Alto.Client.Controls.Dispatch.DispatchResources.DeliveryPointFilterManager.get_DeliveryPointsVisible() in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\DeliveryPointFilterManager.cs:line 38 at Alto.Client.Controls.Dispatch.DispatchResources.UcDeliveryPoint.get_Title() in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\UcDeliveryPoint.cs:line 1520 at Alto.Client.Controls.Dispatch.DispatchResources.UcDeliveryPoint.updatePanelTitle() in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\UcDeliveryPoint.cs:line 543 at Alto.Client.Controls.Dispatch.DispatchResources.UcDeliveryPoint.onFilterChanged(Object sender, GridViewCollectionChangedEventArgs e) in d:\Builds\45153\Alto\Alto.Prod\src\Alto\Alto.Client\Controls\Dispatch\DispatchResources\UcDeliveryPoint.cs:line 547 at Telerik.WinControls.UI.GridViewCollectionChangedEventHandler.Invoke(Object sender, GridViewCollectionChangedEventArgs e) at Telerik.WinControls.UI.RadGridView.OnFilterChanged(Object sender, GridViewCollectionChangedEventArgs e) at Telerik.WinControls.UI.EventDispatcher.RaiseEvent[T](Object eventKey, Object sender, T args) at Telerik.WinControls.UI.GridViewFilterDescriptorCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs args) at Telerik.Collections.Generic.NotifyCollection`1.InsertItem(Int32 index, T item) at Telerik.WinControls.UI.GridViewFilterDescriptorCollection.InsertItem(Int32 index, FilterDescriptor item) at System.Collections.ObjectModel.Collection`1.Add(T item) at Telerik.WinControls.UI.GridViewDataColumn.SetFilterDescriptor(FilterDescriptor value) at Telerik.WinControls.UI.GridHeaderCellElement.filterPopup_FilterConfirmed(Object sender, EventArgs e) at Telerik.WinControls.UI.BaseFilterPopup.OnFilterConfirmed() at Telerik.WinControls.UI.RadListFilterPopup.OnButtonOkClick(EventArgs e) at Telerik.WinControls.UI.RadListFilterPopup.ButtonOK_Click(Object sender, EventArgs e) at Telerik.WinControls.RadElement.OnClick(EventArgs e) at Telerik.WinControls.UI.RadButtonItem.OnClick(EventArgs e) at Telerik.WinControls.UI.RadButtonElement.OnClick(EventArgs e) at Telerik.WinControls.RadElement.DoClick(EventArgs e) at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args) at Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e) at Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ScrollableControl.WndProc(Message& m) at Telerik.WinControls.RadControl.WndProc(Message& m) at Telerik.WinControls.UI.RadPopupControlBase.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) ---- InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at Telerik.WinControls.UI.DataGroup.<GetEnumerator>d__0.MoveNext() at Telerik.WinControls.Data.GroupBuilder`1.Perform(IReadOnlyCollection`1 items, Int32 level, Group`1 parent) at Telerik.WinControls.Data.DataItemGroup`1.get_Groups() at Telerik.WinControls.UI.DataGroup.get_Groups() at Telerik.WinControls.UI.GridViewTemplate.InvalidateSummaryRowsCore(DataGroup group, Boolean invalidateChildren) at Telerik.WinControls.UI.GridViewTemplate.InvalidateSummaryRowsCore(DataGroup group, Boolean invalidateChildren) at Telerik.WinControls.UI.GridViewTemplate.InvalidateGroupSummaryRows(DataGroup group, Boolean invalidateChildren) at Telerik.WinControls.UI.GridViewTemplate.RefreshSummaryRowsInGroup(NotifyCollectionChangedEventArgs e) at Telerik.WinControls.UI.GridViewTemplate.RefreshAggregates(NotifyCollectionChangedEventArgs e) at Telerik.WinControls.UI.MasterGridViewTemplate.OnViewChanged(Object sender, DataViewChangedEventArgs e) at Telerik.WinControls.Data.RadDataView`1.RebuildData(Boolean notify) at Telerik.WinControls.Data.RadDataView`1.OnNotifyPropertyChanged(PropertyChangedEventArgs e) at Telerik.WinControls.Data.RadCollectionView`1.OnNotifyPropertyChanged(String propertyName) at Telerik.WinControls.UI.GridViewSortDescriptorCollection.OnCollectionChanged(NotifyCollectionChangedEventArgs args) at Telerik.WinControls.UI.GridViewSortDescriptorCollection.RemoveItem(Int32 index) at Telerik.WinControls.UI.GridViewColumn.Sort(RadSortOrder sortOrder, Boolean multiSortMode) at Telerik.WinControls.UI.GridHeaderCellElement.Sort(RadSortOrder sortOrder) at Telerik.WinControls.UI.GridHeaderRowBehavior.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.UI.BaseGridBehavior.OnMouseUp(MouseEventArgs e) at Telerik.WinControls.UI.RadGridView.OnMouseUp(MouseEventArgs e) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at Telerik.WinControls.RadControl.WndProc(Message& m) at Telerik.WinControls.UI.RadGridView.WndProc(Message& m) at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
The new mode should allow copying of single cells even when having the SelectionMode set to FullRowSelect. The attached project features a possible workaround.
To reproduce:
this.radGridView1.Columns.Add("FIRST CELL ID A");
this.radGridView1.Rows.Add("405-55-214-41763");
this.radGridView1.Rows.Add("405-55-214-46682");
this.radGridView1.Rows.Add("405-55-214-46682");
this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.MultiSelect = true;
this.radGridView1.SelectionMode = Telerik.WinControls.UI.GridViewSelectionMode.CellSelect;
Please refer to the attached gif file illustrating better the text moving.
Workaround:
private void radGridView1_CellFormatting(object sender, Telerik.WinControls.UI.CellFormattingEventArgs e)
{
e.CellElement.BorderBottomWidth = 2;
e.CellElement.BorderRightWidth = 2;
e.CellElement.BorderTopWidth = 2;
e.CellElement.BorderLeftWidth = 2;
}
Please refer to the attached sample project and follow the steps illustrated in the gif file. Note: the same behavior is observed with the CellValidating event in the new row. Workaround: use the RowValidating event instead: private void radGridView1_RowValidating(object sender, Telerik.WinControls.UI.RowValidatingEventArgs e) { if (e.Row is Telerik.WinControls.UI.GridViewNewRowInfo && e.Row.Cells["Id"].Value == null) { this.radGridView1.MasterView.TableAddNewRow.CancelAddNewRow(); this.radGridView1.CurrentRow = this.radGridView1.MasterView.TableAddNewRow; } }
NOTE: The CellValidating event is fired multiple times as well when you select a new tab in RadDock. There is a second project attached.
To reproduce: if you pin a calculator or a hyperlink column you will notice that the cells belonging to these columns remain white. However, the cells from other column types have a light blue/gray fill color for pinned state.
Workaround:
private void RadGridView1_CellFormatting(object sender, CellFormattingEventArgs e)
{
if (e.Column.IsPinned)
{
e.CellElement.BackColor = Color.FromArgb(235, 244, 252);
}
else
{
e.CellElement.ResetValue(LightVisualElement.BackColorProperty, ValueResetFlags.Local);
}
}
To reproduce:
Please run the sample project and follow the steps from the gif file.
Workaround:
private void radGridView1_SizeChanged(object sender, EventArgs e)
{
this.radGridView1.MasterTemplate.Refresh();
}
public class Grid : RadGridView
{
public override string ThemeClassName
{
get
{
return typeof(RadGridView).FullName;
}
}
protected override void OnResize(EventArgs e)
{
object value = null;
if (this.ActiveEditor != null)
{
value = this.ActiveEditor.Value;
}
base.OnResize(e);
if (value != null && this.CurrentCell != null)
{
this.CurrentCell.Value = value;
}
}
}
To reproduce: run the attached sample project.
Type "chef" in the search box and then try to sort some of the columns. Click the header cell several times and as a result the exception will occur.
Workaround:
public class CustomGrid : RadGridView
{
public new object DataSource
{
get
{
return (object)base.DataSource;
}
set
{
GridViewSearchRowInfo.Cancel = true;
Thread.Sleep(100);
base.DataSource = null;
this.EnableFiltering = false;
base.DataSource = value;
this.EnableFiltering = true;
base.CurrentRow = null;
}
}
}
A similar issue can be also observed in RadTreeView:
Workaround RadGridView:
private void RadGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
{
RadTextBoxEditor editor = e.ActiveEditor as RadTextBoxEditor;
if (editor != null)
{
editor.EditorElement.MinSize = new Size(0, 30);
}
}
Workaround RadTreeView:
private void RadTreeView1_EditorInitialized(object sender, TreeNodeEditorInitializedEventArgs e)
{
TreeViewTextBoxEditor editor = e.Editor as TreeViewTextBoxEditor;
if (editor != null)
{
((BaseTextBoxEditorElement)editor.EditorElement).TextBoxItem.TextBoxControl.MinimumSize = new Size(0, 24);
}
}
In 125% the RadTextBox in the Fluent theme keeps shrinking:
Workaround
public RadForm1()
{
InitializeComponent();
SizeF dpi = NativeMethods.GetMonitorDpi(Screen.PrimaryScreen, NativeMethods.DpiType.Effective);
this.radTextBox1.MinimumSize = new Size(0, (int)(24 * dpi.Height));
}
To reproduce: run the attached sample project. Type "res" in the search box very very fast. You will notice that the results with starting with "re" are highlighted. Note: it is usually reproducible the first serahc after loading the form.
To reproduce: setup self-reference hierarchy. Add a GridViewHyperlinkColumn and show the expander item in this column. Please refer to the attached screenshot. The hyperlink text overlaps with the expander. Workaround: set the MasterTemplate.SelfReferenceExpanderColumn to a different column.