Completed
Last Updated: 28 Nov 2016 07:03 by ADMIN
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;
Completed
Last Updated: 25 Nov 2016 12:10 by ADMIN
Please refer to the attached sample project and select a new value in the drop down.

Workaround: change the PageSize in the RadDropDownListElement.PopupClosed event:

public sealed class PageSizeDropdownHeaderCellElement : GridHeaderCellElement
{
    public PageSizeDropdownHeaderCellElement(GridViewColumn col, GridRowElement row) : base(col, row)
    {
        TextAlignment = ContentAlignment.TopCenter;
        Alignment = ContentAlignment.TopCenter;
    }

    private RadDropDownListElement _dropDownListElement;

    protected override void CreateChildElements()
    {
        base.CreateChildElements();
        _dropDownListElement = new RadDropDownListElement();
        if (_dropDownListElement != null && _dropDownListElement.DataSource == null)
        {
            _dropDownListElement = new RadDropDownListElement();
            _dropDownListElement.BindingContext = new BindingContext();
            _dropDownListElement.DropDownStyle = Telerik.WinControls.RadDropDownStyle.DropDownList;

            _dropDownListElement.Items.Clear();
            _dropDownListElement.Items.Add(new RadListDataItem("10", 10) { Selected = true });
            _dropDownListElement.Items.Add(new RadListDataItem("25", 25));
            _dropDownListElement.Items.Add(new RadListDataItem("50", 50));
            _dropDownListElement.Items.Add(new RadListDataItem("100", 100));
            _dropDownListElement.Items.Add(new RadListDataItem("All", -1));

            _dropDownListElement.Margin = new Padding(15, 0, 0, 0);
            _dropDownListElement.StretchHorizontally = true;
            _dropDownListElement.NotifyParentOnMouseInput = false;
            _dropDownListElement.Popup.MouseClick += Popup_MouseClick;
            _dropDownListElement.PopupClosed += _dropDownListElement_PopupClosed; 
            this.Children.Add(_dropDownListElement);
        }
    }

    RadListVisualItem elementUnderMouse;

    private void Popup_MouseClick(object sender, MouseEventArgs e)
    {
        elementUnderMouse = _dropDownListElement.Popup.ElementTree.GetElementAtPoint(e.Location) as RadListVisualItem;
    }
    
    private void _dropDownListElement_PopupClosed(object sender, RadPopupClosedEventArgs args)
    {
        if (elementUnderMouse == null)
        {
            return;
        }
        if (_dropDownListElement.SelectedIndex == -1)
            return;

        var pageSize = Convert.ToInt32(elementUnderMouse.Data.Value);
        if (pageSize == -1)
        {
            pageSize = GridControl.RowCount;
        }
        else
        {
            pageSize = pageSize <= GridControl.RowCount ? pageSize : GridControl.RowCount;
        }
        this.RowInfo.Tag = pageSize;
        GridControl.PageSize = pageSize;
        elementUnderMouse = null;
    }
    
    protected override void SetContentCore(object value)
    {
        if (_dropDownListElement != null && this.RowInfo.Tag != null)
        {
            this._dropDownListElement.SelectedValue = (int)this.RowInfo.Tag;
        }
    }

    public override bool IsCompatible(GridViewColumn data, object context)
    {
        return data is ActionColumn && context is GridTableHeaderRowElement;
    }

    protected override Type ThemeEffectiveType     
            { 
                get    
                { 
                    return typeof(GridHeaderCellElement);     
                }
            }
}


Completed
Last Updated: 25 Nov 2016 08:51 by ADMIN
To reproduce:

GridViewTextBoxColumn textBoxColumn1 = new GridViewTextBoxColumn("Col 1");
textBoxColumn1.FieldName = "col1";
radGridView1.MasterTemplate.Columns.Add(textBoxColumn1);
GridViewTextBoxColumn textBoxColumn2 = new GridViewTextBoxColumn("Col 2");
textBoxColumn2.FieldName = "col2";
textBoxColumn2.FormatString = "{0:d}"; 
radGridView1.MasterTemplate.Columns.Add(textBoxColumn2);
radGridView1.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;

DataTable dt = new DataTable();
dt.Columns.Add("col1", typeof(string));
dt.Columns.Add("col2", typeof(DateTime));
for (int i = 0; i < 10; i++)
{
    dt.Rows.Add("Item" + i, DateTime.Now.AddDays(i)); 
}
this.radGridView1.AutoGenerateColumns = false;
this.radGridView1.DataSource = dt;

Right click the row header cell and select Copy. The  following exception occurs although we don't have a GridViewDateTimeColumn : System.InvalidCastException was unhandled
  HResult=-2147467262
  Message=Unable to cast object of type 'Telerik.WinControls.UI.GridViewTextBoxColumn' to type 'Telerik.WinControls.UI.GridViewDateTimeColumn'.
  Source=Telerik.WinControls.GridView
  StackTrace:
       at Telerik.WinControls.UI.MasterGridViewTemplate.CopyRows(String format, Boolean cut, Boolean cutOperation, StringBuilder content)
       at Telerik.WinControls.UI.MasterGridViewTemplate.ProcessContent(String format, Boolean cut, Boolean cutOperation)
       at Telerik.WinControls.UI.MasterGridViewTemplate.CopyContent(Boolean cut)
       at Telerik.WinControls.UI.MasterGridViewTemplate.Copy()
       at Telerik.WinControls.UI.GridDataRowElement.copyItem_Click(Object sender, EventArgs e)
       at Telerik.WinControls.RadElement.OnClick(EventArgs e)
       at Telerik.WinControls.UI.RadButtonItem.OnClick(EventArgs e)
       at Telerik.WinControls.UI.RadMenuItem.OnClick(EventArgs e)
       at Telerik.WinControls.RadElement.DoClick(EventArgs e)
       at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
       at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
       at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args)
       at Telerik.WinControls.RadElement.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
       at Telerik.WinControls.RadItem.RaiseBubbleEvent(RadElement sender, RoutedEventArgs args)
       at Telerik.WinControls.RadElement.RaiseRoutedEvent(RadElement sender, RoutedEventArgs args)
       at Telerik.WinControls.RadElement.DoMouseUp(MouseEventArgs e)
       at Telerik.WinControls.ComponentInputBehavior.OnMouseUp(MouseEventArgs e)
       at Telerik.WinControls.RadControl.OnMouseUp(MouseEventArgs e)
       at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       at System.Windows.Forms.Control.WndProc(Message& m)
       at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
       at Telerik.WinControls.RadControl.WndProc(Message& m)
       at Telerik.WinControls.UI.RadPopupControlBase.WndProc(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       at System.Windows.Forms.Application.Run(Form mainForm)
       at _1075342CopyText.Program.Main() in d:\Projects\1075342CopyText_Binding\Program.cs:line 17
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Workaround: use a GridViewDateTimeColumn 
Completed
Last Updated: 25 Nov 2016 08:50 by ADMIN
Please refer to the attached gif file illustrating how to reproduce the error with the Demo application.

Workaround: this.radGridView1.UseScrollbarsInHierarchy = true;
Completed
Last Updated: 24 Nov 2016 12:32 by ADMIN
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.
Completed
Last Updated: 24 Nov 2016 12:09 by ADMIN
To reproduce:
- Subscribe to the CellClick event 
- Click several times in the grid with the right mouse button. 
- At some point, the CellClick event will be executed. 

Workaround:
- Use the Click event:

private void RadGridView1_Click(object sender, EventArgs e)
{
    var args = e as MouseEventArgs;
    if (args.Button == MouseButtons.Left)
    {
        var clickedCell = radGridView1.ElementTree.GetElementAtPoint(args.Location) as GridDataCellElement;
        if (clickedCell != null)
        {
            //add your code here
        }
    }
}

Completed
Last Updated: 24 Nov 2016 11:34 by ADMIN
Use attached project to reproduce. The video shows what steps you need to take. 

Workaround:
Use CellEndEdit instead. 
Completed
Last Updated: 24 Nov 2016 11:33 by ADMIN
Use the attached project to reproduce. The video shows what steps you need to take. 

Completed
Last Updated: 24 Nov 2016 11:32 by ADMIN
To reproduce:

private void Form2_Load(object sender, EventArgs e) 
{ 
    this.productsTableAdapter.Fill(this.nwindDataSet.Products); 
    this.categoriesTableAdapter.Fill(this.nwindDataSet.Categories);

    this.radGridView1.AutoGenerateHierarchy = true;
    this.radGridView1.DataSource = this.nwindDataSet;
    this.radGridView1.DataMember = "Categories";
    this.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
    this.radGridView1.MasterTemplate.Templates.First().AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;

    GridViewSummaryItem summaryItem = new GridViewSummaryItem();
    summaryItem.Name = "CategoryID";
    summaryItem.Aggregate = GridAggregateFunction.Count;
    GridViewSummaryRowItem summaryRowItem = new GridViewSummaryRowItem();
    summaryRowItem.Add(summaryItem);
    this.radGridView1.SummaryRowsTop.Add(summaryRowItem);

    GridViewSummaryItem summaryItem2 = new GridViewSummaryItem();
    summaryItem2.Name = "UnitPrice";
    summaryItem2.Aggregate = GridAggregateFunction.Sum;
    GridViewSummaryRowItem summaryRowItem2 = new GridViewSummaryRowItem();
    summaryRowItem2.Add(summaryItem2);
    this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop.Add(summaryRowItem2); 
}

private void SetNumberFormat()
{
    this.radGridView1.Columns["CategoryID"].FormatString = "{0:F4}";
    this.radGridView1.SummaryRowsTop[0][0].FormatString = "{0:F4}";

    this.radGridView1.MasterTemplate.Templates.First().Columns["UnitPrice"].FormatString = "{0:F4}";
    this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop[0][0].FormatString = "{0:F4}";
}

private void radButton1_Click(object sender, EventArgs e)
{
    SetNumberFormat();
}

Workaround: Clear and add back the summary rows when a value in the child template is changed. 
private void radButton1_Click(object sender, EventArgs e)
{
    this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop.Clear();

    GridViewSummaryItem summaryItem2 = new GridViewSummaryItem();
    summaryItem2.Name = "UnitPrice";
    summaryItem2.Aggregate = GridAggregateFunction.Sum;
    GridViewSummaryRowItem summaryRowItem2 = new GridViewSummaryRowItem();
    summaryRowItem2.Add(summaryItem2);
    this.radGridView1.MasterTemplate.Templates.First().SummaryRowsTop.Add(summaryRowItem2); 

    SetNumberFormat();
}
Completed
Last Updated: 24 Nov 2016 09:26 by ADMIN
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. 


Completed
Last Updated: 24 Nov 2016 06:27 by ADMIN
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
Unplanned
Last Updated: 21 Nov 2016 12:31 by ADMIN
The specified format in the DisplayFormat attribute should be considered when automatically generating the GridViewDateTimeColumn.

public RadForm1()
{
    InitializeComponent();

    List<Item> items = new List<Item>();
    for (int i = 0; i < 5; i++)
    {
        items.Add(new Item(DateTime.Now.AddDays(i)));
    }

    this.radGridView1.DataSource = items;
    this.radGridView1.AutoSizeColumnsMode = Telerik.WinControls.UI.GridViewAutoSizeColumnsMode.Fill;
}

public class Item
{
    [System.ComponentModel.DisplayName("My Date")]
    [System.ComponentModel.DataAnnotations.DisplayFormat(DataFormatString = "{0:MM/dd/yyyy}")]
    public DateTime Date { get; set; }

    public Item(DateTime date)
    {
        this.Date = date;
    }
}
Unplanned
Last Updated: 21 Nov 2016 12:29 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: GridView
Type: Bug Report
1
To reproduce: please refer to the attached gif file and sample project. The multiple newly added rows are selected only when the grid is not sorted.

Workaround: use Begin/EndUpdate when adding multiple rows
 private void radButton1_Click(object sender, EventArgs e)
 {
     this.radGridView1.ClearSelection();
     this.radGridView1.BeginUpdate();
     for (int i = 0; i < 3; i++)
     {
         GridViewDataRowInfo row = new GridViewDataRowInfo(this.radGridView1.MasterView);
         row.IsSelected = true;
         row.IsCurrent = true;
         row.Cells["Id"].Value = this.radGridView1.Rows.Count;
         row.Cells["Name"].Value = "Row" + row.Cells["Id"].Value;
         this.radGridView1.Rows.Add(row);
     }

     this.radGridView1.EndUpdate();
 }

Completed
Last Updated: 21 Nov 2016 08:54 by ADMIN
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.
Completed
Last Updated: 09 Nov 2016 13:51 by ADMIN
ADMIN
Created by: Dess | Tech Support Engineer, Principal
Comments: 0
Category: GridView
Type: Bug Report
1
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
Completed
Last Updated: 09 Nov 2016 07:59 by ADMIN
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
}
Unplanned
Last Updated: 09 Nov 2016 07:28 by ADMIN
To reproduce: please refer o the attached sample project:

1.Click the left button. A new row will be added to the left grid and the grid will scroll to it.
2. Move the scrollbar back to the top and sort the ID column.
3. Click the left button again. A new row will be added but the grid won't scroll to it.

Perform the same steps with the right grid. The grid scrolls as expected when you add a new row in a sorted grid. 

Workaround: use the Rows.Add method instead of Rows.AddNew.
Unplanned
Last Updated: 08 Nov 2016 15:28 by ADMIN
To reproduce:
The attached video shows how you can reproduce this.

Workaround:
Use the Properties window to remove summary rows. 
Unplanned
Last Updated: 08 Nov 2016 14:34 by ADMIN
To reproduce: please refer to the attached sample project and gif file. 

Workaround:

private void radGridView1_CellEditorInitialized(object sender, GridViewCellEventArgs e)
        {
            RadDateTimeEditor editor = e.ActiveEditor as RadDateTimeEditor;
            if (editor != null)
            {
                RadDateTimeEditorElement el = editor.EditorElement as RadDateTimeEditorElement;
                if (el != null)
                {
                    el.TextBoxElement.TextBoxItem.GotFocus -= TextBoxItem_GotFocus; 
                    el.TextBoxElement.TextBoxItem.GotFocus += TextBoxItem_GotFocus; 
                }
            }
        }

        private void TextBoxItem_GotFocus(object sender, EventArgs e)
        {
            RadTextBoxItem tb = sender as RadTextBoxItem;
            if (tb != null)
            {
                tb.SelectionLength = 0;
            }
        }
Unplanned
Last Updated: 08 Nov 2016 14:18 by ADMIN
To reproduce:

public RadForm1()
{
    InitializeComponent();  

    this.radGridView1.MasterTemplate.Columns.Add(new GridViewDecimalColumn("ParentId"));
    this.radGridView1.MasterTemplate.Columns.Add(new GridViewTextBoxColumn("ParentName"));
     
    this.radGridView1.MasterTemplate.Rows.Add(1, "Item" + 1);
    this.radGridView1.MasterTemplate.Rows.Add(2, "Item" + 2);
     
    this.radGridView1.MasterTemplate.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;

    for (int i = 0; i < 10; i++)
    {
        GridViewTemplate template = new GridViewTemplate();
        template.AllowAddNewRow = false;
        template.AutoSizeColumnsMode = GridViewAutoSizeColumnsMode.Fill;
        template.Caption = "Tab" + i;
        template.Columns.Add(new GridViewDecimalColumn("Id"));
        template.Columns.Add(new GridViewTextBoxColumn("Name"));
        this.radGridView1.MasterTemplate.Templates.Add(template);
        template.HierarchyDataProvider = new GridViewEventDataProvider(template);
    }
    
    this.radGridView1.RowSourceNeeded += radGridView1_RowSourceNeeded;
}

private void radGridView1_RowSourceNeeded(object sender, GridViewRowSourceNeededEventArgs e)
{
    for (int i = 0; i < 10; i++)
    {
        GridViewRowInfo row = e.Template.Rows.NewRow();
        row.Cells["Id"].Value = e.ParentRow.Cells["ParentId"].Value;
        row.Cells["name"].Value = "child row" + i;
        e.SourceCollection.Add(row);
    }
}

private void radGridView1_ViewCellFormatting(object sender, CellFormattingEventArgs e)
{
    GridDetailViewCellElement cell = e.CellElement as GridDetailViewCellElement; 
    if (cell != null)
    { 
        RadPageViewStripElement strip = cell.PageViewElement as RadPageViewStripElement;
        strip.StripButtons = StripViewButtons.LeftScroll | StripViewButtons.RightScroll; 
    }
}

If you have just one row on the master level, the strip buttons don't navigate the tabs.

Workaround:  add a dummy row that is hidden: 

private void radGridView1_RowFormatting(object sender, RowFormattingEventArgs e)
{
    if (e.RowElement.RowInfo == this.radGridView1.Rows.Last())
    {
        e.RowElement.RowInfo.Height = 1;
        e.RowElement.RowInfo.MinHeight = 1;
        e.RowElement.RowInfo.MaxHeight = 1;
    }
    else
    { 
        e.RowElement.RowInfo.Height = 25;
        e.RowElement.RowInfo.MinHeight = 25;
        e.RowElement.RowInfo.MaxHeight = 25;
    }
}