We'd like to see the ability to enable a search/filter function for column chooser. One of our applications that uses the RadGridView has dozens of columns, most hidden by default. Our users would like the ability to type in part of a column name and have the column chooser filter on it.
How to reproduce:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.radGridView1.DataSource = this.GetData();
this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
this.radGridView1.EnableFiltering = true;
this.radGridView1.ShowHeaderCellButtons = true;
this.radGridView1.FilterPopupRequired += RadGridView1_FilterPopupRequired;
GridViewDateTimeColumn date = this.radGridView1.Columns["Date"] as GridViewDateTimeColumn;
date.DataType = typeof(DateTime);
date.FilteringMode = GridViewTimeFilteringMode.Date;
}
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;
}
}
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));
dt.Columns.Add("Bool", typeof(bool));
DateTime date = DateTime.Now;
for (int i = 0; i < 1500; i++)
{
dt.Rows.Add(i, "Name " + i, date.AddDays(i), i % 2 == 0);
}
return dt;
}
Workaround: 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 = typeof(RadListFilterPopup).GetField("listFilterElement", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).
GetValue(this) as IRadListFilterElement;
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 = base.DataColumn.Name;
compositeFilterDescriptor.LogicalOperator = FilterLogicalOperator.Or;
foreach (DictionaryEntry entry in listFilterElement.SelectedValues)
{
foreach (object value in (ArrayList)entry.Value)
{
FilterDescriptor descriptor;
if (base.DataColumn is GridViewDateTimeColumn || base.DataColumn.DataType == typeof(DateTime) ||
base.DataColumn.DataType == typeof(DateTime?))
{
descriptor = new DateFilterDescriptor(base.DataColumn.Name, FilterOperator.IsEqualTo, (DateTime?)value, false);
}
else
{
descriptor = new FilterDescriptor(base.DataColumn.Name, FilterOperator.IsEqualTo, value);
}
compositeFilterDescriptor.FilterDescriptors.Add(descriptor);
}
}
base.FilterDescriptor = compositeFilterDescriptor;
OnFilterConfirmed();
}
}
}
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++;
}
}
}
}
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.