To reproduce:
public RadForm1()
{
InitializeComponent();
DataTable master = new DataTable();
master.Columns.Add("ID", typeof(int));
master.Columns.Add("test", typeof(string));
for (int i = 0; i < 500; i++)
{
master.Rows.Add(i, "Row " + i);
}
radGridView1.DataSource = master;
radLabel1.Text = "RadGridView: AutoSizeRows = " + ((radGridView1.AutoSizeRows) ? "True" : "False");
}
private void radButton1_Click(object sender, EventArgs e)
{
radGridView1.TableElement.ScrollToRow(radGridView1.MasterTemplate.Rows[200]);
}
private void radButton2_Click(object sender, EventArgs e)
{
radGridView1.AutoSizeRows = !radGridView1.AutoSizeRows;
radLabel1.Text = "RadGridView: AutoSizeRows = " + ((radGridView1.AutoSizeRows) ? "True" : "False");
}
Workaround:
this.radGridView1.ViewDefinition = new CustomTableViewDefinition();
public class CustomTableViewDefinition : TableViewDefinition
{
public override IRowView CreateViewUIElement(GridViewInfo viewInfo)
{
return new CustomGridTableElement();
}
}
public class CustomGridTableElement : GridTableElement
{
protected override Type ThemeEffectiveType
{
get
{
return typeof(GridTableElement);
}
}
public override void ScrollToRow(GridViewRowInfo rowInfo)
{
if (rowInfo == null || rowInfo.IsPinned || !rowInfo.IsVisible || rowInfo is GridViewDetailsRowInfo)
{
return;
}
this.ViewElement.InvalidateMeasure();
this.ViewElement.UpdateLayout();
if (GridViewElement.AutoSizeRows || (ViewTemplate.Templates.Count > 0 && rowInfo.ViewTemplate.Parent != null))
{
ScrollToRowCore(rowInfo, false);
return;
}
this.RowScroller.ScrollToItem(rowInfo, false);
this.UpdateLayout();
}
private void ScrollToRowCore(GridViewRowInfo rowInfo, bool ensureVisible)
{
if (!this.GridViewElement.UseScrollbarsInHierarchy && this.ViewInfo.ParentRow != null)
{
if (ensureVisible)
{
this.GridViewElement.TableElement.EnsureRowVisible(rowInfo);
}
else
{
this.GridViewElement.TableElement.ScrollToRow(rowInfo);
}
return;
}
if (!this.IsInValidState(true) || this.VScrollBar.LargeChange == 0)
{
return;
}
RadControl control = this.ElementTree.Control as RadControl;
if (control != null)
{
control.SuspendUpdate();
}
int oldValue = this.VScrollBar.Value;
GridRowElement rowElement = GetChildRowElement(rowInfo);
if (rowElement == null && this.PageViewMode == PageViewMode.ExplorerBar)
{
if (control != null)
{
control.ResumeUpdate();
}
return;
}
while (this.VScrollBar.Value < this.VScrollBar.Maximum)
{
if (rowElement == null)
{
rowElement = GetChildRowElement(rowInfo);
}
if (rowElement != null)
{
ScrollToPartiallyVisibleRow(rowElement, ensureVisible);
break;
}
else
{
bool scrollRangeChanged = SetScrollValue(this.VScrollBar, this.VScrollBar.Value + this.VScrollBar.SmallChange);
if (this.VScrollBar.Value >= this.VScrollBar.Maximum - this.VScrollBar.LargeChange + 1 && !scrollRangeChanged)
{
SetScrollValue(this.VScrollBar, oldValue);
break;
}
}
}
if (oldValue == this.VScrollBar.Minimum || rowElement != null)
{
if (control != null)
{
control.ResumeUpdate();
}
return;
}
SetScrollValue(this.VScrollBar, 0);
while (this.VScrollBar.Value < oldValue)
{
if (rowElement == null)
{
rowElement = GetChildRowElement(rowInfo);
}
if (rowElement != null)
{
ScrollToPartiallyVisibleRow(rowElement, ensureVisible);
break;
}
else
{
bool scrollRangeChanged = SetScrollValue(this.VScrollBar, this.VScrollBar.Value + this.VScrollBar.SmallChange);
if (this.VScrollBar.Value >= this.VScrollBar.Maximum - this.VScrollBar.LargeChange + 1 && !scrollRangeChanged)
{
SetScrollValue(this.VScrollBar, oldValue);
break;
}
}
}
if (control != null)
{
control.ResumeUpdate();
}
}
private GridRowElement GetChildRowElement(GridViewRowInfo rowInfo)
{
if (rowInfo.ViewInfo == this.ViewInfo)
{
return GetRowElement(rowInfo);
}
else
{
GridTableElement tableElement = GridViewElement.GetRowView(rowInfo.ViewInfo) as GridTableElement;
if (tableElement != null)
{
return tableElement.GetRowElement(rowInfo);
}
}
return null;
}
private void ScrollToPartiallyVisibleRow(GridRowElement rowElement, bool ensureVisible)
{
int delta = 0;
while ((rowElement.ControlBoundingRectangle.Y < ViewElement.ScrollableRows.ControlBoundingRectangle.Y &&
rowElement.ControlBoundingRectangle.Bottom > ViewElement.ScrollableRows.ControlBoundingRectangle.Y) ||
(rowElement.ControlBoundingRectangle.Y < ViewElement.ScrollableRows.ControlBoundingRectangle.Bottom &&
rowElement.ControlBoundingRectangle.Bottom > ViewElement.ScrollableRows.ControlBoundingRectangle.Bottom))
{
if (rowElement.ControlBoundingRectangle.Y < ViewElement.ScrollableRows.ControlBoundingRectangle.Y &&
rowElement.ControlBoundingRectangle.Bottom > ViewElement.ScrollableRows.ControlBoundingRectangle.Y)
{
delta = ViewElement.ScrollableRows.ControlBoundingRectangle.Y - rowElement.ControlBoundingRectangle.Y;
SetScrollValue(this.VScrollBar, this.VScrollBar.Value - delta);
return;
}
if (rowElement.ControlBoundingRectangle.Y < ViewElement.ScrollableRows.ControlBoundingRectangle.Bottom &&
rowElement.ControlBoundingRectangle.Bottom > ViewElement.ScrollableRows.ControlBoundingRectangle.Bottom)
{
delta = rowElement.ControlBoundingRectangle.Top - ViewElement.ScrollableRows.ControlBoundingRectangle.Top;
SetScrollValue(this.VScrollBar, this.VScrollBar.Value + delta);
return;
}
if (ensureVisible)
{
delta = rowElement.ControlBoundingRectangle.Bottom - ViewElement.ScrollableRows.ControlBoundingRectangle.Bottom;
if (delta < 0)
{
break;
}
}
else
{
delta = rowElement.ControlBoundingRectangle.Y - ViewElement.ScrollableRows.ControlBoundingRectangle.Y;
if (delta < 0)
{
delta = 0;
}
}
bool scrollRangeChanged = SetScrollValue(this.VScrollBar, this.VScrollBar.Value + delta);
if (this.VScrollBar.Value >= this.VScrollBar.Maximum - this.VScrollBar.LargeChange + 1 || !scrollRangeChanged)
{
break;
}
}
}
private bool SetScrollValue(RadScrollBarElement scrollbar, int newValue)
{
int max = this.VScrollBar.Maximum;
if (newValue > scrollbar.Maximum - scrollbar.LargeChange + 1)
{
newValue = scrollbar.Maximum - scrollbar.LargeChange + 1;
}
if (newValue < scrollbar.Minimum)
{
newValue = scrollbar.Minimum;
}
scrollbar.Value = newValue;
this.UpdateLayout();
return max != this.VScrollBar.Maximum;
}
}