We use cookies to give you the best experience on our website. If you continue to browse, then you agree to our privacy policy and cookie policy. Image for the cookie policy date
Unfortunately, activation email could not send to your email. Please try again.
Syncfusion Feedback

How to programmatically select the records of the Master-DetailsView at run time?

Platform: WPF |
Control: SfDataGrid

You can select the records of the Master-DetailsView programmatically at run time by setting the corresponding child grid row index to the SfDataGrid.SelectedIndex property. This can be achieved by passing the row index of both the parent and child grids. Before setting the SelectedIndex to child grid, you need to check whether the corresponding parent record is in the expanded or collapsed state. When it is expanded, you can directly select the records of the child grid; otherwise, you need to expand it manually by using the SfDataGrid.ExpandDetailsViewAt helper method. You can also bring the corresponding DetailsView grid into the view by using the DetailsViewManager.BringToView helper method. This is demonstrated in the following code example.

 

C#

int parentRowIndex =45, childRowIndex = 1;
private void btn_Click(object sender, RoutedEventArgs e)
{            
    //Checks whether the given index is parent row index or not. 
    bool IsDetailsViewIndex=this.dataGrid.IsInDetailsViewIndex(parentRowIndex);            
    if(IsDetailsViewIndex==true)
    {
        MessageBox.Show("Specified Index is  not valid parent row index ");
        return;
    }
    //Gets the record of the parent row index.
    var record = this.dataGrid.View.Records[this.dataGrid.ResolveToRecordIndex(parentRowIndex)];
    //Gets the DetailsViewManager by using Reflection.
    var propertyInfo = dataGrid.GetType().GetField("DetailsViewManager", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    DetailsViewManager detailsViewManager = propertyInfo.GetValue(dataGrid) as DetailsViewManager;
    // Checks whether the parent record has the child grid or not by getting the child source and its count.
    var childSource = detailsViewManager.GetChildSource(record.Data, "OrderDetails");
    var GetChildSourceCount = detailsViewManager.GetType().GetMethod("GetChildSourceCount", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
    var ChildSourceCount = GetChildSourceCount.Invoke(detailsViewManager,new object[]{childSource});                             
    if ((int)ChildSourceCount == 0)
    {
        MessageBox.Show("Child grid doesn't contains any record");
        return;
    }         
    //Checks whether the record is Expanded or Collapsed.
    //When it is in the collapsed state, you need to expand the particular DetailsView based on the index.
    if (!record.IsExpanded)       this.dataGrid.ExpandDetailsViewAt(this.dataGrid.ResolveToRecordIndex(parentRowIndex));
    //Gets the index of the DetailsView.
    int index = 0;
    foreach (var def in this.dataGrid.DetailsViewDefinition)
    {
        if (def.RelationalColumn == "OrderDetails")
        {
            index = this.dataGrid.DetailsViewDefinition.IndexOf(def);
            index = parentRowIndex + index + 1;
        }
    }           
    //Brings the parent row in the view. 
    var rowcolumnIndex = new RowColumnIndex(index , 1);
    dataGrid.ScrollInView(rowcolumnIndex);
    //Gets the DetailsViewDataGrid by passing the corresponding rowindex and relation name.
    var detailsViewDataGrid = this.dataGrid.GetDetailsViewGrid(this.dataGrid.ResolveToRecordIndex(parentRowIndex), "OrderDetails");
    //Checks whether the given index is currently in view or not.
    //When the specified index is not currently in view, you can bring that row in to the view by using the SfDataGrid.ScrollInView method.
    var firstline = this.dataGrid.GetVisualContainer().ScrollRows.GetVisibleLines().FirstOrDefault(line => line.Region == ScrollAxisRegion.Body);
    var lastline = this.dataGrid.GetVisualContainer().ScrollRows.GetVisibleLines().LastOrDefault(line => line.Region == ScrollAxisRegion.Body);
    if (firstline.LineIndex > index || lastline.LineIndex <= index)
    {               
        //Brings the details view grid in to the view and sets the child grid's SelectedIndex as the ChildRowIndex.
        if (record != null && record.IsExpanded)
        {                
            if (detailsViewDataGrid == null)
            {
                detailsViewManager.BringIntoView(index);
                detailsViewDataGrid = this.dataGrid.GetDetailsViewGrid(this.dataGrid.ResolveToRecordIndex(parentRowIndex), "OrderDetails");
            }                  
        }              
    }
    detailsViewDataGrid.SelectedIndex = childRowIndex;         
}       

 

Note:

You can get the DetailsViewDataGrid by passing the corresponding rowindex and different relation name when the DetailsView has more than one level.

 

 

Sample Links:

 

WPF

 

WinRT

 

UWP

2X faster development

The ultimate WPF UI toolkit to boost your development speed.
ADD COMMENT
You must log in to leave a comment
Comments
Zeljko Lazic
Feb 26, 2020

WPF Link problem: Access Denied

You don’t have permission to access this file. The reason may be:

•The incident associated with this file is not tied to the account you used to log in. To Logout use this link. •Your enterprise portal admin has not allowed you to access other portal users’ incidents. Ask admin to change the support visibility in their Syncfusion profile.

If you feel this information is wrong and you need to download this file, please contact us.

Reply

Please sign in to access our KB

This page will automatically be redirected to the sign-in page in 10 seconds.

Up arrow icon

Warning Icon You are using an outdated version of Internet Explorer that may not display all features of this and other websites. Upgrade to Internet Explorer 8 or newer for a better experience.Close Icon

Live Chat Icon For mobile