To reproduce: - Add one-to-many relations hierarchy 3 or more child templates. - Export the grid using GridViewSpreadExport - The child rows of the last parent row are missing. Workaround: Add an empty parent row at the end of the grid.
To reproduce: - Bind the grid to an object that contains enum property. - Save the layout - Restart the application and load the layout before setting the DataSource of the grid. Workaround: Load the layout after the DataSource is set.
Description: if you filter a text column with "Does not contains" operator, the produced FilterDescriptors.Expression is "ProductName NOT LIKE '%c%' OR ProductName IS NULL". However, if you try to programmatically add this expression to the RadGridView.FilterDescriptors.Expression property it doesn't filter the grid. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.ProductsTableAdapter.Fill(Me.NwindDataSet.Products) Me.RadGridView1.EnableFiltering = True End Sub Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click Me.RadGridView1.FilterDescriptors.Expression = "ProductName NOT LIKE '%c%' OR ProductName IS NULL" End Sub Workaround: don't set expression but add a FilterDescriptor: http://docs.telerik.com/devtools/winforms/gridview/filtering/setting-filters-programmatically-(simple-descriptors) Dim filter1 As New FilterDescriptor() filter1.[Operator] = FilterOperator.NotContains filter1.Value = "c" filter1.IsFilterEditor = True filter1.PropertyName = "ProductName" Me.RadGridView1.FilterDescriptors.Add(filter1)
To reproduce: populate a grid and enable multiple selection. Use cell selection. When you click the row header, the entire row (all cells from the row) is selected no matter the SelectionMode. However, if you start a selection from the row header and move the cursor, only the cells from the first column get selected. The attached gif file illustrates the behavior. The expected behavior is that all cells from the affected columns should be selected when starting the selection from the row header. Workaround: Sub New() InitializeComponent() Me.RadGridView1.MultiSelect = True Me.RadGridView1.SelectionMode = Telerik.WinControls.UI.GridViewSelectionMode.CellSelect AddHandler Me.RadGridView1.MouseDown, AddressOf GridMouseDown AddHandler Me.RadGridView1.MouseUp, AddressOf GridMouseUp AddHandler Me.RadGridView1.MouseMove, AddressOf GridMouseMove End Sub Dim isMouseDown = False Dim startRow As GridViewRowInfo Dim lastHoveredCell As GridCellElement Private Sub GridMouseDown(sender As Object, e As MouseEventArgs) Dim cell As GridRowHeaderCellElement = TryCast(Me.RadGridView1.ElementTree.GetElementAtPoint(e.Location), GridRowHeaderCellElement) If cell IsNot Nothing Then isMouseDown = True startRow = cell.RowInfo End If End Sub Private Sub GridMouseUp(sender As Object, e As MouseEventArgs) isMouseDown = False startRow = Nothing End Sub Private Sub GridMouseMove(sender As Object, e As MouseEventArgs) If isMouseDown Then Dim cellUnderMouse As GridCellElement = TryCast(Me.RadGridView1.ElementTree.GetElementAtPoint(e.Location), GridCellElement) If cellUnderMouse IsNot Nothing AndAlso Not cellUnderMouse.Equals(lastHoveredCell) Then lastHoveredCell = cellUnderMouse Me.RadGridView1.ClearSelection() Me.RadGridView1.SelectedCells.BeginUpdate() If startRow.Index > cellUnderMouse.RowInfo.Index Then For index = cellUnderMouse.RowInfo.Index To startRow.Index Me.RadGridView1.Rows(index).IsSelected = True Next Else For index = startRow.Index To cellUnderMouse.RowInfo.Index For Each cell As GridViewCellInfo In Me.RadGridView1.Rows(index).Cells cell.IsSelected = True Next Next End If Me.RadGridView1.SelectedCells.EndUpdate(True) End If End If End Sub
To reproduce: populate the grid with data and use the following code snippet: Me.RadGridView1.EnableAlternatingRowColor = True Me.RadGridView1.TableElement.AlternatingRowColor = Color.LightGray Me.RadGridView1.MultiSelect = True Me.RadGridView1.SelectionMode = Telerik.WinControls.UI.GridViewSelectionMode.CellSelect Select multiple cells from different rows. You will notice that alternating color is not applied to the rows for which you have a selected cell. The attached gif file illustrates the behavior. Workaround: Sub New() InitializeComponent() Me.RadGridView1.MultiSelect = True Me.RadGridView1.SelectionMode = Telerik.WinControls.UI.GridViewSelectionMode.CellSelect End Sub Private Sub RadGridView1_CellFormatting(sender As Object, e As Telerik.WinControls.UI.CellFormattingEventArgs) _ Handles RadGridView1.CellFormatting e.CellElement.DrawFill = True e.CellElement.GradientStyle = Telerik.WinControls.GradientStyles.Solid If e.CellElement.IsSelected Then e.CellElement.ResetValue(LightVisualElement.BackColorProperty, ValueResetFlags.Local) ElseIf e.CellElement.RowInfo.Index Mod 2 = 0 Then e.CellElement.BackColor = Color.White Else e.CellElement.BackColor = Color.LightGray End If End Sub
Please refer to the attached gif file illustrating how to reproduce the error with the Demo application. Workaround: this.radGridView1.UseScrollbarsInHierarchy = true;
To reproduce: Sub New() InitializeComponent() Dim dt As New DataTable() dt.Columns.Add("Price", GetType(System.Double)) dt.Columns.Add("Name", GetType(System.String)) dt.Columns.Add("Nr", GetType(System.Double)) For i As Integer = 0 To 49 dt.Rows.Add(i, "Data" & i, i) Next With Me.RadGridView1 .DataSource = dt .Columns("Price").FormatString = "{0:C2}" .Columns("Nr").FormatString = "{0:N1}" .Columns("Price").ExcelExportType = Export.DisplayFormatType.Currency ' .AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill End With Me.RadGridView1.Columns("Price").ExcelExportType = Export.DisplayFormatType.Currency Me.RadGridView1.Columns("Nr").ExcelExportType = Export.DisplayFormatType.Custom Me.RadGridView1.Columns("Nr").ExcelExportFormatString = "{0:N1}" Me.RadGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill End Sub Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click Dim spreadStreamExport As New GridViewSpreadStreamExport(Me.RadGridView1) spreadStreamExport.ExportVisualSettings = True Dim fileName As String = "..\..\" + DateTime.Now.ToLongTimeString().Replace(":", "_").ToString() + ".xlsx" spreadStreamExport.RunExport(fileName, New SpreadStreamExportRenderer()) Process.Start(fileName) End Sub Workaround: Me.RadGridView1.Columns("Nr").ExcelExportType = Export.DisplayFormatType.Fixed AddHandler spreadStreamExport.CellFormatting, AddressOf CellFormatting Private Sub CellFormatting(sender As Object, e As SpreadStreamCellFormattingEventArgs) If e.ExportCell.ColumnIndex = 2 Then e.ExportCell.ExportFormat = "0.0" End If End Sub
Workaround: custom CompositeFilterForm private void radGridView1_CreateCompositeFilterDialog(object sender, GridViewCreateCompositeFilterDialogEventArgs e) { e.Dialog = new MyCompositeFilterForm(); } public class MyCompositeFilterForm : CompositeFilterForm { public override void Initialize(GridViewDataColumn dataColumn, Telerik.WinControls.Data.FilterDescriptor filterDescriptor, bool useTypedEditors) { base.Initialize(dataColumn, filterDescriptor, useTypedEditors); if (dataColumn.Name == "Time") { RadDateTimePicker rEditor = (RadDateTimePicker)this.RightEditor; rEditor.DateTimePickerElement.ShowTimePicker = true; rEditor.DateTimePickerElement.CalendarSize = new Size(500, 250); RadDateTimePicker lEditor = (RadDateTimePicker)this.LeftEditor; lEditor.DateTimePickerElement.ShowTimePicker = true; lEditor.DateTimePickerElement.CalendarSize = new Size(500, 250); } } protected override void OnClosing(System.ComponentModel.CancelEventArgs e) { base.OnClosing(e); if (this.DialogResult == DialogResult.OK) { object leftValue = this.GetValueFromDateEditor(this.LeftEditor); if (leftValue != null) { this.LeftDescriptor.Value = leftValue; } object rightValue = this.GetValueFromDateEditor(this.RightEditor); if (rightValue != null) { this.RightDescriptor.Value = rightValue; } } } protected virtual object GetValueFromDateEditor(RadControl editorControl) { object value = null; if (editorControl is RadDateTimePicker) { value = ((RadDateTimePicker)editorControl).Value; return value; } return value; } }
To reproduce: public RadForm1() { InitializeComponent(); DataTable dt = new DataTable(); dt.Columns.Add("Id"); dt.Columns.Add("Name"); for (int i = 0; i < 50; i++) { dt.Rows.Add(i, "Data" + i); } this.radGridView1.DataSource = dt; this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill; this.radGridView1.AutoSizeRows = false; } private void RadForm1_Load(object sender, EventArgs e) { this.radGridView1.Rows[5].MinHeight = 80; this.radGridView1.Rows[5].MaxHeight = 100; } The Min/MaxHeight is not respected even when resizing the row. Workaround: set the Height property.
Please refer to the attached sample project which result is illustrated in the provided screenshot. Workaround: this.radGridView1.ClearSelection(); this.radGridView1.CurrentRow = null; this.radGridView1.Rows[1].Cells[2].IsSelected = true;
Use attached project to reproduce. The video shows what steps you need to take. Workaround: Use CellEndEdit instead.
Use the attached project to reproduce. The video shows what steps you need to take.
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 200000 dt.Rows.Add(index, "Item" & index) Next Me.RadGridView1.DataSource = dt Me.RadGridView1.MultiSelect = True Me.RadGridView1.SelectionMode = Telerik.WinControls.UI.GridViewSelectionMode.CellSelect End Sub Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click Dim sw As New Stopwatch sw.Start() Dim mi As MethodInfo = GetType(GridViewSelectedCellsCollection).GetMethod("BeginUpdate", BindingFlags.Instance Or BindingFlags.NonPublic) mi.Invoke(Me.RadGridView1.MasterTemplate.SelectedCells, Nothing) For Each row As GridViewDataRowInfo In Me.RadGridView1.Rows row.Cells("Name").IsSelected = True Next Dim mi2 As MethodInfo = GetType(GridViewSelectedCellsCollection).GetMethod("EndUpdate", BindingFlags.Instance Or BindingFlags.NonPublic) mi2.Invoke(Me.RadGridView1.MasterTemplate.SelectedCells, New Object() {True}) sw.Stop() RadMessageBox.Show(sw.ElapsedMilliseconds) End Sub
To reproduce: DataTable table; public RadForm1() { InitializeComponent(); table = GetTable(); radGridView1.DataSource = table; } private void radButton1_Click(object sender, EventArgs e) { var changes = table.GetChanges(); if (changes == null) { Console.WriteLine("No Changes"); } else { Console.WriteLine("Saved"); foreach (DataRow item in changes.Rows) { Console.WriteLine(item.RowState.ToString()); } } table.AcceptChanges(); } static DataTable GetTable() { DataTable table = new DataTable(); table.Columns.Add("Dosage", typeof(int)); table.Columns.Add("Drug", typeof(string)); table.Columns.Add("Name", typeof(string)); table.Columns.Add("Date", typeof(DateTime)); table.Rows.Add(25, "Indocin", "David", DateTime.Now); table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now); table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now); table.Rows.Add(21, "Combivent", "Janet", DateTime.Now); table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now); table.AcceptChanges(); return table; } Workaround: (this.radGridView1.CurrentRow.DataBoundItem as IEditableObject).EndEdit();
Workaround: public partial class Form1 : Form { public Form1() { InitializeComponent(); this.radGridView1.DataSource = this.GetData(); this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; ((GridViewDateTimeColumn)this.radGridView1.Columns["Date"]).FormatString = "{0: yyyy-MM-dd hh:mm:ss.fff tt}"; } private DataTable 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)); for (int i = 0; i < 100; i++) { dt.Rows.Add(i, "Name " + i, DateTime.Now.AddDays(i), i % 2 == 0); } return dt; } } public class MyRadGridView : RadGridView { public override string ThemeClassName { get { return typeof(RadGridView).FullName; } } protected override RadGridViewElement CreateGridViewElement() { return new MyRadGridViewElement(); } } public class MyRadGridViewElement : RadGridViewElement { protected override Type ThemeEffectiveType { get { return typeof(MyRadGridViewElement); } } protected override MasterGridViewTemplate CreateTemplate() { return new MyMasterGridViewTemplate(); } } public class MyMasterGridViewTemplate : MasterGridViewTemplate { public override void Copy() { base.Copy(); GridViewCellInfo[] cells = null; if (this.SelectionMode == GridViewSelectionMode.CellSelect) { cells = new GridViewCellInfo[this.SelectedCells.Count]; this.SelectedCells.CopyTo(cells, 0); } else if (this.SelectionMode == GridViewSelectionMode.FullRowSelect) { GridViewDataRowInfo row = this.SelectedRows[0] as GridViewDataRowInfo; if (this.SelectedRows.Count == 1 && row.ViewTemplate.CurrentColumn != null) { cells = new GridViewCellInfo[row.Cells.Count]; for (int i = 0; i < row.Cells.Count; i++) { cells[i] = row.Cells[i]; } } } if (Clipboard.GetData(DataFormats.Text) != null) { string data = Clipboard.GetData(DataFormats.Text).ToString(); if (data != string.Empty && cells != null) { var values = data.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries); StringBuilder sb = new StringBuilder(); foreach (string value in values) { DateTime date; if (DateTime.TryParse(value, out date)) { string baseFormat = "yyyy-MM-dd HH:mm tt"; foreach (var cell in cells) { if (cell.ColumnInfo is GridViewDateTimeColumn && ((DateTime)cell.Value).ToString(baseFormat) == date.ToString(baseFormat)) { sb.Append(string.Format(((GridViewDateTimeColumn)cell.ColumnInfo).FormatString, cell.Value) + "\t"); break; } } } else { sb.Append(value + "\t"); } } Clipboard.Clear(); Clipboard.SetData(DataFormats.Text, sb.ToString()); } } } }
To reproduce: public Form1() { InitializeComponent(); for (int i = 0; i < 10; i++) { this.radGridView1.Columns.Add("column " + i); } int charsCount = 5; for (int i = 0; i < 20; i++) { this.radGridView1.Rows.Add(new string('0', charsCount), new string('1', charsCount), new string('2', charsCount), new string('3', charsCount), new string('4', charsCount), new string('5', charsCount), new string('6', charsCount), new string('7', charsCount), new string('8', charsCount), new string('9', charsCount)); } HtmlViewDefinition view = new HtmlViewDefinition(); view.RowTemplate.Rows.Add(new RowDefinition()); view.RowTemplate.Rows.Add(new RowDefinition()); view.RowTemplate.Rows.Add(new RowDefinition()); view.RowTemplate.Rows[0].Cells.Add(new CellDefinition("Column 0", 0, 1, 1)); view.RowTemplate.Rows[0].Cells.Add(new CellDefinition("Column 1", 0, 1, 3)); view.RowTemplate.Rows[0].Cells.Add(new CellDefinition("Column 2", 0, 1, 1)); view.RowTemplate.Rows[0].Cells.Add(new CellDefinition("Column 3", 0, 1, 1)); view.RowTemplate.Rows[0].Cells.Add(new CellDefinition("Column 7", 0, 1, 1)); view.RowTemplate.Rows[1].Cells.Add(new CellDefinition("Column 4", 0, 1, 2)); view.RowTemplate.Rows[1].Cells.Add(new CellDefinition("Column 5", 0, 2, 1)); view.RowTemplate.Rows[1].Cells.Add(new CellDefinition("Column 8", 0, 1, 1)); view.RowTemplate.Rows[2].Cells.Add(new CellDefinition("Column 6", 0, 2, 1)); view.RowTemplate.Rows[2].Cells.Add(new CellDefinition("Column 9", 0, 1, 1)); this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; this.radGridView1.ViewDefinition = view; } Workaround: private void radGridView1_SizeChanged(object sender, EventArgs e) { this.radGridView1.MasterTemplate.Refresh(); }
The issue can be reproduced with the .40 version of the assemblies and in a scenario in which the grid is added as a RadMenuHostItem to the Items collection of a drop-down button. Workaround: set the BindingContext of the grid to equal that of the form: public Form1() { InitializeComponent(); radGridView1.BindingContext = this.BindingContext; }
To reproduce: 1. Use the following code: public Form1() { InitializeComponent(); this.radGridView1.EnableFiltering = true; GridViewDecimalColumn col = new GridViewDecimalColumn(); col.Name = "Calculated Column"; col.HeaderText = "Order value"; radGridView1.Columns.Add(col); radGridView1.Columns["Calculated Column"].Expression = "Freight/Sum(Freight)"; } private void Form1_Load(object sender, EventArgs e) { this.ordersTableAdapter.Fill(this.nwindDataSet.Orders); this.radGridView1.DataSource = this.ordersBindingSource; this.radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill; GridViewSummaryItem summaryItem = new GridViewSummaryItem(); summaryItem.Name = "Freight"; summaryItem.Aggregate = GridAggregateFunction.Sum ; GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem(); summaryRowItem.Add(summaryItem); this.radGridView1.SummaryRowsTop.Add(summaryRowItem); this.radGridView1.SummaryRowsBottom.Add(summaryRowItem); } 2. Filter the grid by EmployeeID for example. You will notice that the summary item for Freight is recalculated considering the filtered rows. However, the calculated column doesn't update its values.
To reproduce: - Select several rows and cells in excel and copy them. - Paste in the self-reference grid. - Only the first row is copied. Workaround: private void RadGridView1_Pasting(object sender, GridViewClipboardEventArgs e) { e.Cancel = true; List<List<string>> rows = this.GetTextData(); PrintGridTraverser traverser = new PrintGridTraverser(this.radGridView1.MasterView); while (traverser.Current != this.radGridView1.CurrentRow) { traverser.MoveNext(); } traverser.MovePrevious(); int rowIndex = 0; int colIndex = this.radGridView1.CurrentColumn.Index; while (traverser.MoveNext() && rowIndex < rows.Count) { for (int i = colIndex; i < this.radGridView1.Columns.Count && i - colIndex < rows[rowIndex].Count; i++) { traverser.Current.Cells[i].Value = rows[rowIndex][i - colIndex]; } rowIndex++; } }