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); } }
To reproduce: run the sample project and try to resize some of the columns. RadVirtualGrid has 10 columns and 500 rows. You will notice the laggind while resizing the columns. Actually the number of the visible cells remains the same after the column's resizing. However, the CellValueNeeded event keeps firing.
To reproduce: use the following code snippet. Navigate to the last page and press the button to clear the rows. You will notice that the current page index remains 10 although no rows are available in the grid public RadForm1() { InitializeComponent(); this.radVirtualGrid1.RowCount = 1000; this.radVirtualGrid1.ColumnCount = 5; this.radVirtualGrid1.CellValueNeeded += radVirtualGrid1_CellValueNeeded; this.radVirtualGrid1.EnablePaging = true; } private void radVirtualGrid1_CellValueNeeded(object sender, Telerik.WinControls.UI.VirtualGridCellValueNeededEventArgs e) { e.Value = "Item" + e.RowIndex + "." + e.ColumnIndex; } private void radButton1_Click(object sender, EventArgs e) { this.radVirtualGrid1.RowCount = 0; this.radVirtualGrid1.ColumnCount = 5; } Workaround: this.radVirtualGrid1.VirtualGridElement.FindDescendant<VirtualGridPagingPanelElement>().PageNumberTextBox.Text = "1";
It is difficult to replicate the issue and it is not always reproduced. When using the splitter between columns[1] and columns[2] to resize column[1] I found out that releasing the mouse button doesn't cause the splitter to be released, even when clicking on the grid. It seems to work ok once or twice but once it fails then keeps failing. Workaround: private void radVirtualGrid1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Left) { this.radVirtualGrid1.Cursor = Cursors.Default; } }
To reproduce: please refer to the attached gif file. The CellClick is not fired for the child rows that belong to columns that exceed the width of the parent template. Workaround: set the AutoSizeColumnsMode property to Fill. this.radVirtualGrid1.AutoSizeColumnsMode = Telerik.WinControls.UI.VirtualGridAutoSizeColumnsMode.Fill;
To reproduce: open the Demo application >> VirtualGrid >> First Look example. Follow the steps illustrated in the attached gif file. You will notice that when you expand a row, the "-" sign is show for a second and then it is returned to "+" although the row is still expanded. Workaround: this.radVirtualGrid1.CellFormatting += radVirtualGrid1_CellFormatting; this.radVirtualGrid1.RowExpanded += radVirtualGrid1_RowExpanded; this.radVirtualGrid1.RowCollapsed += radVirtualGrid1_RowCollapsed; private void radVirtualGrid1_RowCollapsed(object sender, VirtualGridRowExpandedEventArgs e) { if (expandedState.ContainsKey(e.RowIndex)) { expandedState[e.RowIndex] = !expandedState[e.RowIndex]; } this.radVirtualGrid1.TableElement.SynchronizeRow(e.RowIndex, true); } Dictionary<int, bool> expandedState = new Dictionary<int, bool>(); private void radVirtualGrid1_RowExpanded(object sender, VirtualGridRowExpandedEventArgs e) { if (!expandedState.ContainsKey(e.RowIndex)) { expandedState.Add(e.RowIndex, false); } expandedState[e.RowIndex] = !expandedState[e.RowIndex]; this.radVirtualGrid1.TableElement.SynchronizeRow(e.RowIndex, true); } private void radVirtualGrid1_CellFormatting(object sender, Telerik.WinControls.UI.VirtualGridCellElementEventArgs e) { VirtualGridIndentCellElement indentCell = e.CellElement as VirtualGridIndentCellElement; if (indentCell != null) { if (expandedState.ContainsKey(e.CellElement.RowIndex) && expandedState[e.CellElement.RowIndex] == true) { indentCell.ExpanderItem.SignImage = Properties.Resources.chevron_up; } else { indentCell.ExpanderItem.SignImage = Properties.Resources.chevron_down; } } }
Hello, we have found another small bug of the RadVirtualGrid control.
When paging is enabled on child view, one of the component of the paging panel overlap whit is parent.
I attach source code and screenshot.
Thanks in advance.
Hi,
I have a problem with the expansion of the last row.
After Row Expanding and Row Collapsing the last or second last row, the last row is not visible because it seems that there I some kind of lock on the scrollbar : it doesn’t scroll down neither with the mouse wheel nor with the button so it is not possible to move on the last row.
If instead you scroll up and then down the row became visible again.
In the attached example project.
Regards
RadVirtualGridElement.Paste does not support pasting into new rows.
I want to override RadVirtualGridElement.Paste to allow to to paste into new rows. Except when I do so, the methods to retrieve information from the clipboard (GetHtmlData/GetTextData/GetCsvData ) are private.
So now I have one request, two solutions:
I was trying to move the NewRow to the bottom of the RadVirtualGrid. I learned that this is not possible. During my attempts I ran into a bug:
Reproduction steps:
Expected behavior:
Observed behavior:
I was trying to move the NewRow to the bottom of the RadVirtualGrid. This is also supported by its big brother RadGridView. I have now learned that this is not supported by RadVirtualGrid.
Hereby my request: Please support this!
I've created a Harmony patch (which works for me); it might help you if you decide to support it:
static class MoveNewRowToBottom
{
[HarmonyPatch(typeof(VirtualGridTableElement), "InvalidatePinnedRows")]
static class VirtualGridTableElement_InvalidatePinnedRows
{
static private bool _isInvalidating;
static private bool Prefix(VirtualGridTableElement __instance)
{
if (_isInvalidating)
return false;
_isInvalidating = true;
__instance.ViewElement.TopPinnedRows.DisposeChildren();
__instance.ViewElement.BottomPinnedRows.DisposeChildren();
var viewInfo = __instance.ViewInfo;
var rowsViewState = __instance.RowsViewState;
var topPinnedItems = rowsViewState.TopPinnedItems;
var bottomPinnedItems = rowsViewState.BottomPinnedItems;
if (viewInfo.ShowFilterRow)
if (!topPinnedItems.Contains(RadVirtualGrid.FilterRowIndex) && !bottomPinnedItems.Contains(RadVirtualGrid.FilterRowIndex))
rowsViewState.SetPinPosition(RadVirtualGrid.FilterRowIndex, PinnedRowPosition.Top);
if (viewInfo.ShowNewRow)
if (!topPinnedItems.Contains(RadVirtualGrid.NewRowIndex) && !bottomPinnedItems.Contains(RadVirtualGrid.NewRowIndex))
rowsViewState.SetPinPosition(RadVirtualGrid.NewRowIndex, PinnedRowPosition.Top);
if (viewInfo.ShowHeaderRow)
if (!topPinnedItems.Contains(RadVirtualGrid.HeaderRowIndex) && !bottomPinnedItems.Contains(RadVirtualGrid.HeaderRowIndex))
rowsViewState.SetPinPosition(RadVirtualGrid.HeaderRowIndex, PinnedRowPosition.Top);
var elementProvider = __instance.RowScroller.ElementProvider;
var topPinnedRows = __instance.ViewElement.TopPinnedRows;
foreach (int topPinnedRow in topPinnedItems.SortTopRowIndexes())
{
VirtualGridRowElement pinnedRow = (VirtualGridRowElement)elementProvider.GetElement(topPinnedRow, null);
topPinnedRows.Children.Add(pinnedRow);
pinnedRow.Attach(topPinnedRow, null);
}
var bottomPinnedRows = __instance.ViewElement.BottomPinnedRows;
foreach (int bottomPinnedRow in bottomPinnedItems.SortBottomRowIndexes())
{
VirtualGridRowElement pinnedRow = (VirtualGridRowElement)elementProvider.GetElement(bottomPinnedRow, null);
bottomPinnedRows.Children.Add(pinnedRow);
pinnedRow.Attach(bottomPinnedRow, null);
}
_isInvalidating = false;
return false;
}
}
static private IEnumerable<int> SortTopRowIndexes(this ReadOnlyCollection<int> topRowIndexes)
{
var specialRowIndex = topRowIndexes.Where(index => index < 0).ToList();
if (specialRowIndex.Contains(RadVirtualGrid.HeaderRowIndex))
yield return RadVirtualGrid.HeaderRowIndex;
if (specialRowIndex.Contains(RadVirtualGrid.NewRowIndex))
yield return RadVirtualGrid.NewRowIndex;
if (specialRowIndex.Contains(RadVirtualGrid.FilterRowIndex))
yield return RadVirtualGrid.FilterRowIndex;
foreach (var index in topRowIndexes.Where(index => index >= 0))
yield return index;
}
static private IEnumerable<int> SortBottomRowIndexes(this ReadOnlyCollection<int> bottomRowIndexes)
{
foreach (var index in bottomRowIndexes.Where(index => index >= 0))
yield return index;
var specialRowIndex = bottomRowIndexes.Where(index => index < 0).ToList();
if (specialRowIndex.Contains(RadVirtualGrid.FilterRowIndex))
yield return RadVirtualGrid.FilterRowIndex;
if (specialRowIndex.Contains(RadVirtualGrid.NewRowIndex))
yield return RadVirtualGrid.NewRowIndex;
if (specialRowIndex.Contains(RadVirtualGrid.HeaderRowIndex))
yield return RadVirtualGrid.HeaderRowIndex;
}
}
The problem also occurs, if you just start the form. For example, on 175% (without drag).
This behavior is observed when the VisualStudio2022Light theme is applied. For example, this is not observed in the Fluent theme.
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.