A newly created grid has its CurrentCell property initialized to Nothing. Pressing [PageDown] or any other key that causes scrolling will crash. Steps to Reproduce: 1. Launch application 2. Press [PageDown] Sub New() InitializeComponent() Me.RadVirtualGrid1.ColumnCount = 50 Me.RadVirtualGrid1.RowCount = 100 AddHandler Me.RadVirtualGrid1.CellValueNeeded, AddressOf RadVirtualGrid1_CellValueNeeded End Sub Private Sub RadVirtualGrid1_CellValueNeeded(sender As Object, e As Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs) e.Value = e.ColumnIndex End Sub Workaround: Me.RadVirtualGrid1.CurrentCell = New Telerik.WinControls.UI.VirtualGridCellInfo(0, 0, Me.RadVirtualGrid1.MasterViewInfo)
To reproduce: - Enable the paging and add 1000 rows. - Press Ctrl + End - An exception is thrown. Workaround: radVirtualGrid1.VirtualGridElement.InputBehavior = new MyBehavior(radVirtualGrid1.VirtualGridElement); class MyBehavior : VirtualGridInputBehavior { public MyBehavior(RadVirtualGridElement element) : base(element) { } protected override bool HandleEndKey(KeyEventArgs keys) { this.GridElement.PageIndex = this.GridElement.TotalPages - 1; return true; //return base.HandleEndKey(keys); } }
The attached gif file illustrates how to reproduce the problem with the Demo application.
Use attached to reproduce (just start it and press enter). Workaround: class MyBehavior : VirtualGridInputBehavior { public MyBehavior(RadVirtualGridElement element) : base(element) { } protected override bool HandleEnterKey(KeyEventArgs keys) { if (this.GridElement.CurrentCell != null) { return base.HandleEnterKey(keys); } return false; } } radVirtualGrid1.VirtualGridElement.InputBehavior = new MyBehavior(radVirtualGrid1.VirtualGridElement);
Workaround: this.radVirtualGrid1.RowCount += 100; this.radVirtualGrid1.TableElement.PagingPanelElement.UpdateView();
To reproduce: void radButton1_Click(object sender, EventArgs e) { this.radVirtualGrid1.CurrentCell = null; } Workaround: class MyRadVirtualGrid : RadVirtualGrid { protected override void CreateChildItems(RadElement parent) { base.CreateChildItems(parent); parent.Children.RemoveAt(0); var field = typeof(RadVirtualGrid).GetField("virtualGridElement", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); var element = new MyVirtualGridElement(); field.SetValue(this,element); parent.Children.Add(element); } } class MyVirtualGridElement : RadVirtualGridElement { protected override Type ThemeEffectiveType { get { return typeof(RadVirtualGridElement); } } protected override bool SetCurrentCell(VirtualGridCellInfo value) { if (value == null) { if (this.IsInEditMode && !this.EndEdit()) { return false; } int row = int.MinValue; VirtualGridViewInfo viewInfo = null; if (this.CurrentCell != null) { row = this.CurrentCell.RowIndex; viewInfo = this.CurrentCell.ViewInfo; } if (this.CurrentCell != null && (value == null || this.CurrentCell.ViewInfo != value.ViewInfo || this.CurrentCell.RowIndex != value.RowIndex)) { VirtualGridRowValidatingEventArgs e = new VirtualGridRowValidatingEventArgs(row, viewInfo); this.OnRowValidating(e); if (e.Cancel) { return false; } } var currentCell = typeof(RadVirtualGridElement).GetField("currentCell", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); currentCell.SetValue(this, value); if (this.CurrentCell != null) { this.EnsureCellVisible(this.CurrentCell.RowIndex, this.CurrentCell.ColumnIndex, this.CurrentCell.ViewInfo); } VirtualGridTableElement tableElement = null; if (this.CurrentCell != null) { tableElement = this.GetTableElement(this.CurrentCell.ViewInfo); } else { tableElement = this.TableElement; } if (tableElement != null) { VirtualGridRowElement rowElement = tableElement.ViewElement.GetRowElement(row); if (rowElement != null) { rowElement.Synchronize(false); } } if (value != null) { tableElement = this.GetTableElement(value.ViewInfo); if (tableElement != null) { VirtualGridRowElement rowElement = tableElement.ViewElement.GetRowElement(value.RowIndex); if (rowElement != null) { rowElement.Synchronize(false); } } } if (viewInfo != null) { VirtualGridRowEventArgs args = new VirtualGridRowEventArgs(row, viewInfo); this.OnRowValidated(args); } this.OnCurrentCellChanged(EventArgs.Empty); return true; } return base.SetCurrentCell(value); } }
To reproduce: - Remove the default padding: private void RadVirtualGrid1_RowExpanding(object sender, VirtualGridRowExpandingEventArgs e) { e.ChildViewInfo.Padding =new Padding(0,0,0,0); } Still some space remains, this can be seen in the demo application as well.
To reproduce: private void RadVirtualGrid1_EditorRequired(object sender, Telerik.WinControls.UI.VirtualGridEditorRequiredEventArgs e) { switch (e.ColumnIndex) { case 1: { VirtualGridTextBoxControlEditor editor = new VirtualGridTextBoxControlEditor(); editor.CharacterCasing = CharacterCasing.Upper; e.Editor = editor; } break; } } - Open the editor and try using the backspace or the arrow keys. Workaround: class MyGrid : RadVirtualGrid { protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (this.ActiveEditor is VirtualGridTextBoxControlEditor) { var editor = this.ActiveEditor as VirtualGridTextBoxControlEditor; var element = editor.EditorElement as RadTextBoxControlElement; element.InputHandler.ProcessKeyDown(e); } } protected override void OnKeyUp(KeyEventArgs e) { base.OnKeyUp(e); if (this.ActiveEditor is VirtualGridTextBoxControlEditor) { var editor = this.ActiveEditor as VirtualGridTextBoxControlEditor; var element = editor.EditorElement as RadTextBoxControlElement; element.InputHandler.ProcessKeyUp(e); } } }
To reproduce: use the following code snippet and follow the steps: public RadForm1() { InitializeComponent(); this.radVirtualGrid1.RowCount = 10; this.radVirtualGrid1.ColumnCount = 5; this.radVirtualGrid1.CellValueNeeded+=radVirtualGrid1_CellValueNeeded; } private void radVirtualGrid1_CellValueNeeded(object sender, Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs e) { e.Value = e.RowIndex + "." + e.ColumnIndex; } 1. Pin (left or right) 1st column 2. Scroll horizontally (to not display 2nd column) 3. Unpin 1st column 4. Scroll horizontally to display 1st column => 1st column is hidden, the only way to make it visible is to resize a column or the entire window Workaround: private void radVirtualGrid1_ContextMenuOpening(object sender, Telerik.WinControls.UI.VirtualGridContextMenuOpeningEventArgs e) { foreach (RadItem item in e.ContextMenu.Items) { if (item.Text == RadVirtualGridLocalizationProvider.CurrentProvider.GetLocalizedString(RadVirtualGridStringId.PinMenuItem)) { foreach (RadMenuItem subItem in ((RadMenuItem)item).Items) { if (subItem.Text == RadVirtualGridLocalizationProvider.CurrentProvider.GetLocalizedString(RadVirtualGridStringId.UnpinColumnMenuItem)) { subItem.Click-=subItem_Click; subItem.Click+=subItem_Click; } } } } } private void subItem_Click(object sender, EventArgs e) { this.radVirtualGrid1.MasterViewInfo.SetColumnWidth(0, this.radVirtualGrid1.MasterViewInfo.GetColumnWidth(0)); }
To reproduce: - Open the attached project. - Unselect Column3 from the list. Workaround: this.radVirtualGrid1.MasterViewInfo.CustomColumns.RemoveAt(0); foreach (VirtualGridRowElement rowElement in this.radVirtualGrid1.VirtualGridElement.TableElement.GetDescendants(delegate(RadElement x) { return x is VirtualGridRowElement; }, TreeTraversalMode.BreadthFirst)) { rowElement.CellContainer.Children.Clear(); }
To reproduce: - Change the editor to VirtualGridDropDownListEditor - Press alpha-numeric key when the grid is not in edit mode. Workaround: radVirtualGrid1.VirtualGridElement.InputBehavior = new MyBehavior(radVirtualGrid1.VirtualGridElement); class MyBehavior : VirtualGridInputBehavior { public MyBehavior(RadVirtualGridElement element) : base(element) { } protected override bool HandleAlphaNumericKey(KeyPressEventArgs keys) { if (!this.GridElement.IsInEditMode && (this.GridElement.BeginEditMode == RadVirtualGridBeginEditMode.BeginEditOnKeystroke || this.GridElement.BeginEditMode == RadVirtualGridBeginEditMode.BeginEditOnKeystrokeOrF2)) { //this.GridElement.HideContextMenu(); this.GridElement.BeginEdit(); if (this.GridElement.ActiveEditor is VirtualGridDropDownListEditor) { string symbol = keys.KeyChar.ToString(); var editor = this.GridElement.ActiveEditor as VirtualGridDropDownListEditor; var element = editor.EditorElement as RadDropDownListEditorElement; if ((element.AutoCompleteMode & AutoCompleteMode.Append) == AutoCompleteMode.Append) { int index = element.AutoCompleteAppend.FindShortestString(symbol); if (index == -1) { element.EditableElementText = symbol; element.EditableElement.SelectionStart = 1; element.EditableElement.SelectionLength = 0; return true; } } } return false; } return base.HandleAlphaNumericKey(keys); } }
To reproduce: use the following code snippet and try to select another cell. public RadForm1() { InitializeComponent(); this.radVirtualGrid1.RowCount = 30; this.radVirtualGrid1.ColumnCount = 5; this.radVirtualGrid1.CellValueNeeded += radVirtualGrid1_CellValueNeeded; this.radVirtualGrid1.CurrentCellChanging += radVirtualGrid1_CurrentCellChanging; } private void radVirtualGrid1_CurrentCellChanging(object sender, Telerik.WinControls.UI.VirtualGridCellInfoCancelEventArgs e) { e.Cancel = true; } private void radVirtualGrid1_CellValueNeeded(object sender, Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs e) { e.Value = e.RowIndex + "." + e.ColumnIndex; } Workaround: public class CustomVirtualGrid : RadVirtualGrid { public override string ThemeClassName { get { return typeof(RadVirtualGrid).FullName; } } protected override void OnMouseDown(MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { return; } base.OnMouseDown(e); } }
To reproduce: public Form1() { InitializeComponent(); this.radVirtualGrid1.ColumnCount = 5; this.radVirtualGrid1.RowCount = 20; this.radVirtualGrid1.CellValueNeeded += radVirtualGrid1_CellValueNeeded; } private void radVirtualGrid1_CellValueNeeded(object sender, Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs e) { e.Value = "Data" + e.RowIndex + "." + e.ColumnIndex; } Workaround: use a custom ScrollableVirtualCellsContainer: public Form1() { InitializeComponent(); this.radVirtualGrid1.CreateRowElement += radVirtualGrid1_CreateRowElement; this.radVirtualGrid1.ColumnCount = 5; this.radVirtualGrid1.RowCount = 20; this.radVirtualGrid1.CellValueNeeded += radVirtualGrid1_CellValueNeeded; } private void radVirtualGrid1_CreateRowElement(object sender, VirtualGridCreateRowEventArgs e) { e.RowElement = new CustomVirtualGridRowElement(); } private void radVirtualGrid1_CellValueNeeded(object sender, Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs e) { e.Value = "Data" + e.RowIndex + "." + e.ColumnIndex; } public class CustomVirtualGridRowElement : VirtualGridRowElement { public CustomVirtualGridRowElement() : base() { FieldInfo fi = typeof(VirtualGridRowElement).GetField("scrollableColumns", BindingFlags.NonPublic | BindingFlags.Instance); ScrollableVirtualCellsContainer scrollableColumns = fi.GetValue(this) as ScrollableVirtualCellsContainer; CustomScrollableVirtualCellsContainer newScrollableColumns = new CustomScrollableVirtualCellsContainer(); FieldInfo fi2 = typeof(ScrollableVirtualCellsContainer).GetField("rowElement", BindingFlags.NonPublic | BindingFlags.Instance); fi2.SetValue(newScrollableColumns, this); this.Children.Remove(scrollableColumns); this.Children.Insert(1, newScrollableColumns); } } public class CustomScrollableVirtualCellsContainer : ScrollableVirtualCellsContainer { protected override SizeF MeasureElementCore(RadElement element, SizeF availableSize) { int scrollOffset = 0; if (this.RowElement.TableElement.ColumnScroller.ScrollMode == ItemScrollerScrollModes.Discrete) { for (int i = 0; i < this.RowElement.TableElement.ColumnScroller.Scrollbar.Value; i++) { scrollOffset += this.RowElement.TableElement.ColumnScroller.GetScrollHeight( this.RowElement.TableElement.ViewInfo.ColumnsViewState.GetItemSize(i)); } } else { scrollOffset = this.RowElement.TableElement.HScrollBar.Value; } VirtualGridCellElement cellElement = element as VirtualGridCellElement; int itemOffset = this.RowElement.ViewInfo.ColumnsViewState.GetItemOffset(cellElement.Data); int itemWidth = this.RowElement.ViewInfo.ColumnsViewState.GetItemSize(cellElement.Data); element.Measure(availableSize); if (itemOffset + itemWidth > scrollOffset && itemOffset < scrollOffset) { return new SizeF((itemOffset + itemWidth) - scrollOffset, element.DesiredSize.Height); } return element.DesiredSize; } }
To reproduce: - Subscribe to the SelectionChanged event. - Move the mouse while holding the left button. - The event is fire multiple times. Workaround: VirtualGridCellInfo prevCell = null; private void OnGridSelectionChanged(object sender, EventArgs e) { if (prevCell != gvItems.CurrentCell) { _selectionChangedCount++; tbLog.AppendText("Selection changed " + _selectionChangedCount + "\r\n"); } prevCell = gvItems.CurrentCell; }
Please refer to the attached sample project.
To reproduce: public RadForm1() { InitializeComponent(); radVirtualGrid1.CellValueNeeded += RadVirtualGrid1_CellValueNeeded; radVirtualGrid1.ColumnCount = 20; radVirtualGrid1.RowCount = 1000; radVirtualGrid1.AutoSizeColumnsMode = Telerik.WinControls.UI.VirtualGridAutoSizeColumnsMode.Fill; } private void RadVirtualGrid1_CellValueNeeded(object sender, Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs e) { e.Value = string.Format("Col {0} Row{1}", e.ColumnIndex, e.RowIndex); } - Press and hold the down key, you will notice that the selection freezes after some time and is updated after the key is released.
To reproduce: public RadForm1() { InitializeComponent(); radVirtualGrid1.CellValueNeeded += RadVirtualGrid1_CellValueNeeded; radVirtualGrid1.ColumnCount = 100; radVirtualGrid1.RowCount = 50; radVirtualGrid1.AutoSizeColumnsMode = Telerik.WinControls.UI.VirtualGridAutoSizeColumnsMode.Fill; radVirtualGrid1.SelectionMode = Telerik.WinControls.UI.VirtualGridSelectionMode.CellSelect; } private void RadVirtualGrid1_CellValueNeeded(object sender, Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs e) { e.Value = string.Format("Col {0} Row{1}", e.ColumnIndex, e.RowIndex); }
Please refer to the attached gif file demonstrating how to reproduce the issue with the Demo application. Workaround: Public Class Form1 Sub New() InitializeComponent() Me.RadVirtualGrid1.AllowAddNewRow = False Me.RadVirtualGrid1.AllowFiltering = False Me.RadVirtualGrid1.ColumnCount = 5 Me.RadVirtualGrid1.MasterViewInfo.RegisterCustomColumn(3) Me.RadVirtualGrid1.RowCount = 1 End Sub Private Sub RadVirtualGrid1_CreateCellElement(sender As Object, e As VirtualGridCreateCellEventArgs) Handles RadVirtualGrid1.CreateCellElement Dim columnIndex As Integer = e.ColumnIndex If e.ViewInfo.ColumnsViewState.TopPinnedItems.Count > 0 AndAlso e.ColumnIndex - 1 < e.ViewInfo.ColumnsViewState.TopPinnedItems.Count Then columnIndex = e.ViewInfo.ColumnsViewState.TopPinnedItems(e.ColumnIndex - 1) End If If columnIndex = 3 AndAlso e.RowIndex >= 0 Then e.CellElement = New RedCellElement() End If End Sub Private Sub RadVirtualGrid1_CellValueNeeded(sender As Object, e As VirtualGridCellValueNeededEventArgs) Handles RadVirtualGrid1.CellValueNeeded e.Value = String.Format("{0}x{1}", e.RowIndex, e.ColumnIndex) End Sub End Class Class RedCellElement Inherits VirtualGridCellElement Sub New() MyBase.New() End Sub Private checkBox As RadCheckBoxElement Protected Overrides Sub CreateChildElements() MyBase.CreateChildElements() Me.checkBox = New RadCheckBoxElement() Me.Children.Add(Me.checkBox) End Sub Protected Overrides ReadOnly Property ThemeEffectiveType() As Type Get Return GetType(VirtualGridCellElement) End Get End Property Public Overrides Function IsCompatible(data As Integer, context As Object) As Boolean Dim headerRow As VirtualGridHeaderRowElement = TryCast(context, VirtualGridHeaderRowElement) If data >= 3 AndAlso headerRow Is Nothing Then Return True Else Return False End If End Function Protected Overrides Sub UpdateInfo(args As VirtualGridCellValueNeededEventArgs) MyBase.UpdateInfo(args) Me.NumberOfColors = 1 Me.DrawFill = True Me.BackColor = Color.Red End Sub End Class
When a row/column is resized, and we scroll to the last row/column, they are cut off, due to an error in the item spacing calculation To reproduce: radVirtualGrid1.RowCount = 1000; radVirtualGrid1.ColumnCount = 50; radVirtualGrid1.MasterViewInfo.SetRowHeight(50, 30); for (int i = 0; i < 50; i++) { radVirtualGrid1.MasterViewInfo.SetColumnWidth(i, 60); } void radVirtualGrid1_CellValueNeeded(object sender, VirtualGridCellValueNeededEventArgs e) { e.Value = e.RowIndex + " " + e.ColumnIndex; } Workaround: set the RadVirtualGrid.TableElement.ColumnWidth property to 60 instead of using the SetColumnWidth method and set the radVirtualGrid1.MasterViewInfo.RowSpacing to 0 to overcome the row issue.
Description When the RowCount/ColumnCount amount is decreased, and there are resized rows/column, the scrollable area get invalid. Steps to reproduce: RadVirtualGrid radVirtualGrid1 = new RadVirtualGrid(); public Form1() { InitializeComponent(); radVirtualGrid1.Parent = this; radVirtualGrid1.Dock = DockStyle.Fill; this.Controls.SetChildIndex(radVirtualGrid1, 0); button1.BringToFront(); radVirtualGrid1.RowCount = 1000; radVirtualGrid1.ColumnCount = 50; radVirtualGrid1.CellValueNeeded += radVirtualGrid1_CellValueNeeded; for (int i = 0; i < 50; i++) { radVirtualGrid1.MasterViewInfo.SetRowHeight(i, 30); radVirtualGrid1.MasterViewInfo.SetColumnWidth(i, 60); } } void radVirtualGrid1_CellValueNeeded(object sender, VirtualGridCellValueNeededEventArgs e) { e.Value = e.RowIndex + " " + e.ColumnIndex; } private void button1_Click(object sender, EventArgs e) { radVirtualGrid1.RowCount = 20; radVirtualGrid1.ColumnCount = 20; }