Articles in this section
Category / Section

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

6 mins read

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 by 

WPF DataGrid

 

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


Conclusion

I hope you enjoyed learning about how to.programmatically select the records of the Master-DetailsView at run time in WPF.

You can refer to our WPF DataGrid feature tour page to know about its other groundbreaking feature representations and documentation, and how to quickly get started for configuration specifications. You can also explore our WPF DataGrid example to understand how to create and manipulate data.

For current customers, you can check out our components from the License and Downloads page. If you are new to Syncfusion, you can try our 30-day free trial to check out our other controls.

If you have any queries or require clarifications, please let us know in the comments section below. You can also contact us through our support forumsDirect-Trac, or feedback portal. We are always happy to assist you!


Did you find this information helpful?
Yes
No
Help us improve this page
Please provide feedback or comments
Comments
Please sign in to leave a comment
Access denied
Access denied