Workaround: skip the summary rows by creating custom GridViewSearchRowInfo: private void radGridView1_CreateRowInfo(object sender, GridViewCreateRowInfoEventArgs e) { if (e.RowInfo is GridViewSearchRowInfo) { e.RowInfo = new CustomGridViewSearchRowInfo(e.ViewInfo); } } public class CustomGridViewSearchRowInfo : GridViewSearchRowInfo { public CustomGridViewSearchRowInfo(GridViewInfo viewInfo) : base(viewInfo) { } protected override bool MatchesSearchCriteria(string searchCriteria, GridViewRowInfo row, GridViewColumn col) { if (row is GridViewSummaryRowInfo) { return false; } return base.MatchesSearchCriteria(searchCriteria, row, col); } }
To reproduce: radGridView1.GridNavigator.SelectFirstRow(); for (int i = 0; i < radGridView1.RowCount; i++) { var result = radGridView1.GridNavigator.SelectNextRow(1); } Workaround: - Move to the last row first: radGridView1.GridNavigator.SelectLastRow();
I've attached a sample project. Here are the steps to repeat this issue: 1. Run the application 2. Click column A and drag it to the right to reorder it, scrolling the window as it goes 3. You are eventually presented with a NullReferenceException You may have to try this several times with different columns before the problem manifests. I have found that moving just beyond the right edge of the main form and moving the mouse cursor up and down a little helps. I appears this problem only occurs in grids with many columns, so that fast scrolling can occur for multiple seconds when reordering columns. Workaround: Sub New() InitializeComponent() Me.RadGridView1.GridViewElement.RegisterService(New MyRadGridViewDragDropService(Me.RadGridView1.GridViewElement)) End Sub Public Class MyRadGridViewDragDropService Inherits RadGridViewDragDropService Public Sub New(gridViewElement As RadGridViewElement) MyBase.New(gridViewElement) End Sub Public Overrides ReadOnly Property Name As String Get Return "RadGridViewDragDropService" End Get End Property Protected Overrides Sub PrepareDragHint(dropTarget As Telerik.WinControls.ISupportDrop) Dim dragDropBehavior As IGridDragDropBehavior = Me.GetDragDropBehavior() If dragDropBehavior Is Nothing OrElse dragDropBehavior.DragHint Is Nothing _ OrElse dragDropBehavior.DragHint.Image Is Nothing Then Return End If Dim dropTargetItem As RadItem = TryCast(dropTarget, RadItem) If dropTargetItem IsNot Nothing AndAlso dropTargetItem.ElementTree IsNot Nothing _ AndAlso Not dropTargetItem.ElementTree.Control.Equals(Me.GridViewElement.ElementTree.Control) Then Return End If dragDropBehavior.UpdateDropContext(TryCast(Me.Context, ISupportDrag), dropTarget, Me.beginPoint) Dim hintSize As Size = dragDropBehavior.GetDragHintSize(dropTarget) Dim image As New Bitmap(hintSize.Width, hintSize.Height) Dim temp As Graphics = Graphics.FromImage(image) dragDropBehavior.DragHint.Paint(temp, New RectangleF(PointF.Empty, hintSize)) temp.Dispose() Dim dragHintWindow As New RadLayeredWindow() GetType(RadGridViewDragDropService).GetField("dragHintWindow", _ Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance).SetValue(Me, dragHintWindow) dragHintWindow.BackgroundImage = image End Sub End Class
To reproduce: use the following code snippet. From the filtering box, when you select "Null" and then select "All", the following error occurs: Item has already been added. Key in dictionary: '(Blanks)' Key being added: '(Blanks)' DataTable dt = new DataTable(); dt.Columns.Add("Id", typeof(int)); dt.Columns.Add("Name", typeof(string)); dt.Rows.Add(1,"A"); dt.Rows.Add(2, ""); dt.Rows.Add(3, null); dt.Rows.Add(4, "B"); dt.Rows.Add(5, "C"); dt.Rows.Add(6, ""); this.radGridView1.DataSource = dt; this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill; this.radGridView1.EnableFiltering = true; this.radGridView1.ShowFilteringRow = false; this.radGridView1.ShowHeaderCellButtons = true; Workaround: this.radGridView1.FilterPopupInitialized += radGridView1_FilterPopupInitialized; RadListFilterDistinctValuesTable selectedValues; private void radGridView1_FilterPopupInitialized(object sender, Telerik.WinControls.UI.FilterPopupInitializedEventArgs e) { RadListFilterPopup popup = e.FilterPopup as RadListFilterPopup; selectedValues = popup.MenuTreeElement.SelectedValues; popup.MenuTreeElement.TreeView.NodeCheckedChanged += TreeView_NodeCheckedChanged; } private void TreeView_NodeCheckedChanged(object sender, TreeNodeCheckedEventArgs e) { if (e.Node.CheckState == Telerik.WinControls.Enumerations.ToggleState.Off) { if (selectedValues.Contains(e.Node.Text)) { selectedValues.Remove(e.Node.Text); } } }
To reproduce: - Add an expression column with nullable type as a data source. - Open the property builder. Workaround: Set the data type at run time.
To reproduce: - Add some columns to the grid, make sure that most of the columns are not visible (the user must scroll to view them). - Drag and drop the second column at the last position in the grid. - The result can be seen on the attached image. Workaround: Private Sub Columns_CollectionChanged(ByVal sender As Object, ByVal e As Telerik.WinControls.Data.NotifyCollectionChangedEventArgs) Me.RadGridView1.TableElement.ViewElement.UpdateRowsWhenColumnsChanged() End Sub
To reproduce: public Form1() { InitializeComponent(); BindingList<Item> items = new BindingList<Item>(); for (int i = 0; i < 30; i++) { if (i % 3 == 0) { items.Add(new Item(i,"Item" + i, IndeterminateBoolean.YesAndNo)); } else if (i % 3 == 1) { items.Add(new Item(i, "Item" + i, IndeterminateBoolean.Yes)); } else { items.Add(new Item(i, "Item" + i, IndeterminateBoolean.No)); } } this.radGridView1.DataSource = items; this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.EnableFiltering = true; this.radGridView1.ShowHeaderCellButtons = true; this.radGridView1.ShowFilteringRow = false; } public class Item { public int Id { get; set; } public string Name { get; set; } public IndeterminateBoolean IsActive { get; set; } public Item(int id, string name, IndeterminateBoolean isActive) { this.Id = id; this.Name = name; this.IsActive = isActive; } } public enum IndeterminateBoolean { No, Yes, YesAndNo } Workaround: use custom filtering http://docs.telerik.com/devtools/winforms/gridview/filtering/custom-filtering
To reproduce: public Form1() { InitializeComponent(); BindingList<Item> items = new BindingList<Item>(); for (int i = 0; i < 30; i++) { if (i % 3 == 0) { items.Add(new Item(i,"Item" + i, IndeterminateBoolean.YesAndNo)); } else if (i % 3 == 1) { items.Add(new Item(i, "Item" + i, IndeterminateBoolean.Yes)); } else { items.Add(new Item(i, "Item" + i, IndeterminateBoolean.No)); } } this.radGridView1.DataSource = items; GridViewCheckBoxColumn checkBox = new GridViewCheckBoxColumn("CheckBoxCol"); checkBox.DataTypeConverter = new IndeterminateBooleanToggleStateConverter(); checkBox.FieldName = "IsActive"; checkBox.ThreeState = true; this.radGridView1.Columns.Add(checkBox); this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.EnableFiltering = true; this.radGridView1.ShowHeaderCellButtons = true; this.radGridView1.ShowFilteringRow = false; } public class Item { public int Id { get; set; } public string Name { get; set; } public IndeterminateBoolean IsActive { get; set; } public Item(int id, string name, IndeterminateBoolean isActive) { this.Id = id; this.Name = name; this.IsActive = isActive; } } public enum IndeterminateBoolean { No, Yes, YesAndNo } public class IndeterminateBooleanToggleStateConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { return sourceType == typeof(ToggleState); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { return destinationType == typeof(ToggleState); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is ToggleState) { switch ((ToggleState)value) { case ToggleState.On: return IndeterminateBoolean.Yes; case ToggleState.Off: return IndeterminateBoolean.No; case ToggleState.Indeterminate: default: return IndeterminateBoolean.YesAndNo; } } else { return base.ConvertFrom(context, culture, value); } } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(ToggleState)) { if (value is IndeterminateBoolean) { switch ((IndeterminateBoolean)value) { case IndeterminateBoolean.Yes: return ToggleState.On; case IndeterminateBoolean.No: return ToggleState.Off; case IndeterminateBoolean.YesAndNo: default: return ToggleState.Indeterminate; } } if (value is string) { switch (((string)value ?? string.Empty).Trim()) { case "Yes": return ToggleState.On; case "No": case "": return ToggleState.Off; case "Both": default: return ToggleState.Indeterminate; } } else { return base.ConvertTo(context, culture, value, destinationType); } } else { return base.ConvertTo(context, culture, value, destinationType); } } } Workaround: use the custom filtering functionality: http://docs.telerik.com/devtools/winforms/gridview/filtering/custom-filtering You can access the RadGridView.FilterDescriptors collection and according to the FilterDescriptor.Expression property to determine whether the row will be visible or not.
To reproduce: - Create load on demand hierarchy. - Open the excel filter popup. - The RowSourceNeeded event fires for all rows. Workaround: public class MyGridHeaderCellElement : GridHeaderCellElement { public MyGridHeaderCellElement(GridViewDataColumn col, GridRowElement row) : base(col, row) { } protected override Type ThemeEffectiveType { get { return typeof(GridHeaderCellElement); } } protected override IGridFilterPopup CreateFilterPopup() { this.GridControl.Tag = "FileterInitializing"; return base.CreateFilterPopup(); } } // in the main forms you cab skip the event code execution while the popup is initialized private void RadGridView1_FilterPopupInitialized(object sender, FilterPopupInitializedEventArgs e) { this.radGridView1.Tag = null; } private void RadGridView1_CreateCell(object sender, GridViewCreateCellEventArgs e) { if (object.ReferenceEquals(e.CellType, typeof(GridHeaderCellElement))) { e.CellType = typeof(MyGridHeaderCellElement); } } void radGridView1_RowSourceNeeded(object sender, GridViewRowSourceNeededEventArgs e) { if (radGridView1.Tag != null && radGridView1.Tag == "FileterInitializing") { return; } //other code }
The behavior should be consistent no matter if you change the current column or the current row.
To reproduce: Add the following view: for (int i = 0; i < 8; i++) { radGridView2.Columns.Add("Col" + (i+1)); } ColumnGroupsViewDefinition view = new ColumnGroupsViewDefinition(); view.ColumnGroups.Add(new GridViewColumnGroup("G1")); view.ColumnGroups.Add(new GridViewColumnGroup("G2")); view.ColumnGroups.Add(new GridViewColumnGroup("G3")); view.ColumnGroups[0].Rows.Add(new GridViewColumnGroupRow()); view.ColumnGroups[0].Rows[0].ColumnNames.Add("Col1"); view.ColumnGroups[0].Rows[0].ColumnNames.Add("Col2"); view.ColumnGroups[0].Rows[0].ColumnNames.Add("Col3"); view.ColumnGroups[1].Rows.Add(new GridViewColumnGroupRow()); view.ColumnGroups[1].Rows[0].ColumnNames.Add("Col4"); view.ColumnGroups[1].Rows[0].ColumnNames.Add("Col5"); view.ColumnGroups[2].Rows.Add(new GridViewColumnGroupRow()); view.ColumnGroups[2].Rows[0].ColumnNames.Add("Col6"); view.ColumnGroups[2].Rows[0].ColumnNames.Add("Col7"); view.ColumnGroups[2].Rows[0].ColumnNames.Add("Col8"); radGridView2.ViewDefinition = view; for (int i = 0; i < 10; i++) { radGridView2.Rows.Add("row"+i, "test","test","test","test","test","test"); } radGridView2.Columns[2].IsVisible = false; radGridView2.Columns[7].IsVisible = false; - Then export the grid with the spread exporter.
To reproduce: use the following code snippet. You will notice that the "Accounting Manager" group is missing. private void Form1_Load(object sender, EventArgs e) { this.customersTableAdapter.Fill(this.nwindDataSet.Customers); this.radGridView1.DataSource = this.customersBindingSource; ColumnGroupsViewDefinition view = new ColumnGroupsViewDefinition(); view.ColumnGroups.Add(new GridViewColumnGroup("Customer Contact")); view.ColumnGroups.Add(new GridViewColumnGroup("Details")); view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Address")); view.ColumnGroups[1].Groups.Add(new GridViewColumnGroup("Contact")); view.ColumnGroups[0].Rows.Add(new GridViewColumnGroupRow()); view.ColumnGroups[0].Rows[0].ColumnNames.Add("CompanyName"); view.ColumnGroups[0].Rows[0].ColumnNames.Add("ContactName"); view.ColumnGroups[0].Rows[0].ColumnNames.Add("ContactTitle"); view.ColumnGroups[1].Groups[0].Rows.Add(new GridViewColumnGroupRow()); view.ColumnGroups[1].Groups[0].Rows[0].ColumnNames.Add("Address"); view.ColumnGroups[1].Groups[0].Rows[0].ColumnNames.Add("City"); view.ColumnGroups[1].Groups[0].Rows[0].ColumnNames.Add("Country"); view.ColumnGroups[1].Groups[1].Rows.Add(new GridViewColumnGroupRow()); view.ColumnGroups[1].Groups[1].Rows[0].ColumnNames.Add("Phone"); view.ColumnGroups[1].Groups[1].Rows[0].ColumnNames.Add("Fax"); radGridView1.ViewDefinition = view; GroupDescriptor descriptor = new GroupDescriptor(); descriptor.GroupNames.Add("ContactTitle", ListSortDirection.Ascending); this.radGridView1.GroupDescriptors.Add(descriptor); this.radGridView1.Groups[0].GroupRow.IsPinned = true; }
Enable the ability to MERGE seperate rows (different records), like found in ITunes "Songs" mode where is shows the artwork (then artist,release undernearth) in a custom class, then the related song rows to the right. Your competitor Dev Express has it already in place. See youtube video here : https://www.youtube.com/watch?v=TfPXwE7GcXs Cheers
To reproduce: public Form1() { InitializeComponent(); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text1")); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text2")); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text3")); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text4")); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text5")); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text6")); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text7")); radGridView1.Columns.Add(new GridViewTextBoxColumn("Text8")); radGridView1.Columns.Add(new GridViewDateTimeColumn("Date1")); radGridView1.Columns.Add(new GridViewDecimalColumn("Amount1")); radGridView1.Columns.Add(new GridViewDecimalColumn("Amount2")); radGridView1.Columns.Add(new GridViewDecimalColumn("Amount3")); radGridView1.Columns.Add(new GridViewDecimalColumn("Amount4")); radGridView1.Columns.Add(new GridViewDecimalColumn("Amount5")); radGridView1.Columns.Add(new GridViewDecimalColumn("Amount6")); radGridView1.DataSource = GetDataSet(); } private DataTable GetDataSet() { DataTable dt = new DataTable(); dt.Columns.Add(new DataColumn("Text1", typeof(string))); dt.Columns.Add(new DataColumn("Text2", typeof(string))); dt.Columns.Add(new DataColumn("Text3", typeof(string))); dt.Columns.Add(new DataColumn("Text4", typeof(string))); dt.Columns.Add(new DataColumn("Text5", typeof(string))); dt.Columns.Add(new DataColumn("Text6", typeof(string))); dt.Columns.Add(new DataColumn("Text7", typeof(string))); dt.Columns.Add(new DataColumn("Text8", typeof(string))); dt.Columns.Add(new DataColumn("Date1", typeof(DateTime))); dt.Columns.Add(new DataColumn("Amount1", typeof(decimal))); dt.Columns.Add(new DataColumn("Amount2", typeof(decimal))); dt.Columns.Add(new DataColumn("Amount3", typeof(decimal))); dt.Columns.Add(new DataColumn("Amount4", typeof(decimal))); dt.Columns.Add(new DataColumn("Amount5", typeof(decimal))); dt.Columns.Add(new DataColumn("Amount6", typeof(decimal))); for (int i = 1; i <= 150000; i++) { dt.Rows.Add(new object[] { "Example Text For Row " + i.ToString(), "Example Text For Row " + i.ToString(), "More Example Text For Row " + i.ToString(), "Even More Example Text For Row " + i.ToString(), "Lots More Example Text For Row " + i.ToString(), "Excessive Example Text For Row " + i.ToString(), "Extra Example Text For Row " + i.ToString(), "Random Example Text For Row " + i.ToString(), new DateTime(2015, i % 12 + 1, i % 28 + 1), i % 2 * 10000, i % 3 * 10000, i % 5 * 10000, i % 7 * 10000, i % 11 * 10000, i % 13 * 10000 }); } return dt; } string fileName = @"..\..\" + DateTime.Now.ToLongTimeString().Replace(":", "_"); private void button1_Click(object sender, EventArgs e) { SaveFileDialog sfdExportToExcel = new SaveFileDialog(); DialogResult exportBrowse = sfdExportToExcel.ShowDialog(); if (exportBrowse == DialogResult.OK) { GridViewSpreadExport exporter = new GridViewSpreadExport(this.radGridView1); exporter.SheetMaxRows = Telerik.WinControls.UI.Export.ExcelMaxRows._1048576; exporter.FileExportMode = FileExportMode.CreateOrOverrideFile; exporter.ExportVisualSettings = false; exporter.AsyncExportCompleted += exporter_AsyncExportCompleted; SpreadExportRenderer renderer = new SpreadExportRenderer(); exporter.RunExportAsync(fileName, renderer); } }
The selection mode should be as in Windows Explorer - when Control is pressed, one should be able to move the current row with the up/down arrow keys and when Space is pressed, the current row should be selected/deselected. This implementation can be used for the time being: public partial class Form1 : RadForm { protected override void OnLoad(EventArgs e) { base.OnLoad(e); AddGridSimpleUnbound(); radGridView1.MultiSelect = true; BaseGridBehavior gridBehavior = radGridView1.GridBehavior as BaseGridBehavior; gridBehavior.UnregisterBehavior(typeof(GridViewDataRowInfo)); gridBehavior.RegisterBehavior(typeof(GridViewDataRowInfo), new MyRowBehavior()); radGridView1.GridViewElement.Navigator = new MyNavigator(); } class MyNavigator : BaseGridNavigator { protected override bool DoMultiSelect(GridViewRowInfo oldRow, GridViewColumn oldColumn, GridViewRowInfo row, GridViewColumn column) { if (!this.IsShiftButtonPressed && this.IsControlButtonPressed && !this.IsMouseSelection) { return true; } return base.DoMultiSelect(oldRow, oldColumn, row, column); } } class MyRowBehavior : GridDataRowBehavior { bool kbdSelection = false; public override bool ProcessKeyPress(KeyPressEventArgs keys) { if (kbdSelection) { kbdSelection = false; return true; } return base.ProcessKeyPress(keys); } public override bool ProcessKey(KeyEventArgs keys) { if (keys.KeyCode == Keys.Space && this.GridControl.MultiSelect && keys.Control) { this.GridControl.CurrentRow.IsSelected ^= true; kbdSelection = true; return false; } else { return base.ProcessKey(keys); } } } }
To reproduce: public Form1() { InitializeComponent(); for (int i = 0; i < 10; i++) { this.radGridView1.Columns.Add("Col"+i); } this.radGridView1.TableElement.RowDragHint = null; } Workaround: public Form1() { InitializeComponent(); for (int i = 0; i < 10; i++) { this.radGridView1.Columns.Add("Col"+i); } this.radGridView1.TableElement.RowDragHint = null; CustomRadGridViewDragDropService service = new CustomRadGridViewDragDropService(this.radGridView1.GridViewElement); this.radGridView1.GridViewElement.RegisterService(service); } public class CustomRadGridViewDragDropService : RadGridViewDragDropService { public CustomRadGridViewDragDropService(RadGridViewElement gridViewElement) : base(gridViewElement) { } public override string Name { get { return typeof(RadGridViewDragDropService).Name; } } protected override void PrepareDragHint(ISupportDrop dropTarget) { if (this.GridViewElement.TableElement.RowDragHint == null) { return; } base.PrepareDragHint(dropTarget); } protected override IGridDragDropBehavior GetDragDropBehavior() { IGridDragDropBehavior behavior = null; ISupportDrop dropTarget = this.DropTarget; if (dropTarget is GridHeaderCellElement) { behavior = new CustomGridColumnDragDropBehvavior(); return behavior; } return base.GetDragDropBehavior(); } } public class CustomGridColumnDragDropBehvavior : GridColumnDragDropBehvavior { public override Size GetDragHintSize(ISupportDrop dropTarget) { if (this.DragHint==null) { return new Size(0, 0); } return base.GetDragHintSize(dropTarget); } }
To reproduce: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.RadGridView1.DataSource = Me.ProductsBindingSource Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products) Dim obj As New ConditionalFormattingObject("MyCondition", ConditionTypes.Greater, "30", "", False) obj.CellBackColor = Color.SkyBlue obj.CellForeColor = Color.Red obj.TextAlignment = ContentAlignment.MiddleRight Me.RadGridView1.Columns("UnitPrice").ConditionalFormattingObjectList.Add(obj) End Sub Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click Dim mySQL As String = "SELECT * FROM Products where ProductName = 'Chaii'" Dim myTable As DataTable = getDataInTable(mySQL, My.Settings.NwindConnectionString) Me.RadGridView1.DataSource = myTable End Sub Public Shared Function getDataInTable(mySQLorTable As String, myConnectionString As String, Optional myTimeout As Integer = 30) As DataTable Using myConnection As New System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\Nwind.mdb") Dim myCommand As New OleDb.OleDbCommand(mySQLorTable, myConnection) myConnection.Open() Dim myDataTable As New DataTable Dim myAdapter As New OleDb.OleDbDataAdapter(myCommand) myAdapter.Fill(myDataTable) Return myDataTable End Using End Function When you click the button, the grid is refilled with the query result which does not contain any rows. As a result, a DataException is thrown for each column: "There is no property descriptor corresponding to property name: 'ColumnName'" . Workaround: clear the conditional formatting objects, reset the DataSource and add the conditional formatting objects back
To reproduce: public Form1() { InitializeComponent(); BindingList<Item> items = new BindingList<Item>(); for (int i = 0; i < 10; i++) { items.Add(new Item(i,"Item" + i , DeliveryType.Type1)); } for (int i = 10; i < 20; i++) { items.Add(new Item(i, "Item" + i, DeliveryType.Type2)); } for (int i = 20; i < 30; i++) { items.Add(new Item(i, "Item" + i, DeliveryType.Type3)); } this.radGridView1.DataSource = items; this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill; this.radGridView1.EnableFiltering = true; CompositeFilterDescriptor compositeFilter = new CompositeFilterDescriptor(); compositeFilter.FilterDescriptors.Add(new FilterDescriptor("DeliveryType", FilterOperator.IsEqualTo, DeliveryType.Type2)); compositeFilter.FilterDescriptors.Add(new FilterDescriptor("DeliveryType", FilterOperator.IsEqualTo, DeliveryType.Type3)); compositeFilter.LogicalOperator = FilterLogicalOperator.Or; this.radGridView1.FilterDescriptors.Add(compositeFilter); } public class Item { public int Id { get; set; } public string Name { get; set; } public DeliveryType DeliveryType { get; set; } public Item(int id, string name, DeliveryType deliveryType) { this.Id = id; this.Name = name; this.DeliveryType = deliveryType; } } public enum DeliveryType { Type1, Type2, Type3 } Workaround: use custom filtering: http://docs.telerik.com/devtools/winforms/gridview/filtering/custom-filtering
To reproduce: GridViewImageColumn imageColumn = new GridViewImageColumn(); imageColumn.Name = "ImageColumn"; imageColumn.FieldName = "ImageColumn"; imageColumn.HeaderText = "Picture"; radGridView1.MasterTemplate.Columns.Add(imageColumn); List<classBinding> databinding = new List<classBinding>(); for (int i = 0; i < 35000; i++) { databinding.Add(new classBinding() { ImageColumn = Properties.Resources.Alarm2, }); } radGridView1.DataSource = databinding; public class classBinding { public System.Drawing.Bitmap ImageColumn { get; set; } }
Workaround: suspend columns notifications when preview dropping and resume the notification after the drag drop service has stopped: Dim svc As RadDragDropService = Me.RadGridView1.GridViewElement.GetService(Of RadDragDropService)() AddHandler svc.Stopped, svc_Stopped AddHandler svc.PreviewDragDrop, AddressOf svc_PreviewDragDrop Private Sub svc_PreviewDragDrop(sender As Object, e As RadDropEventArgs) For Each col As GridViewColumn In Me.RadGridView1.Columns col.SuspendPropertyNotifications() Next End Sub Private Function svc_Stopped() As Object For Each col As GridViewColumn In Me.RadGridView1.Columns col.ResumePropertyNotifications() Next End Function