0

I have been trying for hours to manually populate the grid with a nested view, I have read the documentation but for some reason I can't get it to work. I can do it by setting the AutoGenerateRelations and AutoGenerateColumns to true. But I need to define the column header text manually since the names coming form the query are not user readable friendly.

Nested Grid

Private Sub populateGrid(byval ds as DataSet)

             Dim ds As New DataSet()
             ds.Tables.Add(JORs)
             ds.Tables.Add(JORItems)

             ds.Relations.Add(New DataRelation("InventoryItems", ds.Tables(0).Columns("JORNo"), ds.Tables(1).Columns("JORNo")))
             SfDataGrid1.AutoGenerateRelations = True
             SfDataGrid1.AutoGenerateColumns = True
             SfDataGrid1.DataSource = ds

             'gridviewdefinition for datagrid
             Dim gridviewdefinition = New GridViewDefinition()
             gridviewdefinition.RelationalColumn = "InventoryItems"
             grididviewdefinition.DataGrid = New SfDataGrid() With {.Name = "firstlevelnestedgrid", .AutoGenerateColumns = False}
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Doc ID", .HeaderText = "Doc ID"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Doctype", .HeaderText = "Document Type"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Crew", .HeaderText = "Crew"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "JORNo", .HeaderText = "JOR No"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Salesman", .HeaderText = "Salesman"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Company", .HeaderText = "Company"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Well Name", .HeaderText = "Well Name"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Description", .HeaderText = "Description"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "ScheduledDate", .HeaderText = "Shed Date"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Status", .HeaderText = "Status"})
             
             Dim gridviewdefinition2 = New GridViewDefinition()
             gridviewdefinition2.RelationalColumn = "JORNo"
             gridviewdefinition2.DataGrid = New SfDataGrid() With {.Name = "secodlevelnestedgrid", .AutoGenerateColumns = False}
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "JORNo", .HeaderText = "JOR No"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "product", .HeaderText = "Product ID"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "description", .HeaderText = "Product Name"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "QTYHours", .HeaderText = "QTY Hours"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "rate", .HeaderText = "Rate"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "cost", .HeaderText = "Cost"})
             SfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "partNo", .HeaderText = "Part Number"})
                                     
             SfDataGrid1.DetailsViewDefinitions.Add(gridviewdefinition)
             SfDataGrid1.DetailsViewDefinitions.Add(gridviewdefinition2)
            
      End Sub
RicEspn
  • 123
  • 2
  • 4
  • 12

1 Answers1

0

Approach 1:

You can modify the column header text for both the parent DataGrid and the DetailsView DataGrid when AutoGenerateColumns and AutoGenerateRelations are set to true by handling the AutoGeneratingColumn event. Here is an example code snippet:

Dim DataSource As DataTable = GetDataTable()
sfDataGrid1.AutoGenerateColumns = True
sfDataGrid1.AutoGenerateRelations = True
sfDataGrid1.AutoGeneratingColumn += SfDataGrid1_AutoGeneratingColumn
sfDataGrid1.AutoGeneratingRelations += SfDataGrid1_AutoGeneratingRelations
sfDataGrid1.DataSource = DataSource

Private Sub SfDataGrid1_AutoGeneratingColumn(ByVal sender As Object, ByVal 
e As Syncfusion.WinForms.DataGrid.Events.AutoGeneratingColumnArgs)
    'Here you can set your own column name based on its mapping name for 
    'Parent DataGrid
   If e.Column.MappingName = "JORNo" Then 
     e.Column.HeaderText = "Changed Name"
End Sub

Private Sub SfDataGrid1_AutoGeneratingRelations(ByVal sender As Object, 
ByVal e As 
Syncfusion.WinForms.DataGrid.Events.AutoGeneratingRelationsEventArgs)
       'In the DetailsViewDataGrid we should wire the AutoGeneratingColumn 
       'event for details grid.
   e.GridViewDefinition.DataGrid.AutoGeneratingColumn += 
   DataGrid_AutoGeneratingColumn
 End Sub

Private Sub DataGrid_AutoGeneratingColumn(ByVal sender As Object, ByVal e 
As Syncfusion.WinForms.DataGrid.Events.AutoGeneratingColumnArgs)
    'Here you can set your own column name based on its mapping name for                
    'Details View DataGrid
    If e.Column.MappingName = "JORNo" Then 
       e.Column.HeaderText = "Changed Name"
 End Sub

Approach 2:

You can change the HeaderText of the columns by manually adding the columns to the DataGrid when the AutoGenerateColumns and AutoGenerateRelations properties are set to false.

this.sfDataGrid1.AutoGenerateRelations = false;
this.sfDataGrid1.AutoGenerateColumns = false;

'columns for Parent Grid 

sfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Doc ID", 
.HeaderText = "Doc ID"})
sfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = 
"Doctype", .HeaderText = "Document Type"})
sfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "Crew", 
.HeaderText = "Crew"})
sfDataGrid1.Columns.Add(New GridTextColumn() With {.MappingName = "JORNo", 
.HeaderText = "JOR No"})

Dim jORgridviewdefinition = New GridViewDefinition()
'Set the Relation here
jORgridviewdefinition.RelationalColumn = "JORNo"
Dim childGrid As SfDataGrid = New SfDataGrid()
childGrid.AllowResizingColumns = True
childGrid.AutoGenerateColumns = False

childGrid.Columns.Add(New GridTextColumn() With {.MappingName = "JORNo", 
.HeaderText = "JOR No"})
childGrid.Columns.Add(New GridTextColumn() With {.MappingName = "QTYHours", 
.HeaderText = "QTY Hours"})

jORgridviewdefinition.DataGrid = childGrid
'Add your relational definition to the datagrid ie. ParentGrid.
Me.sfDataGrid1.DetailsViewDefinitions.Add(jORgridviewdefinition)
Sathiya
  • 64
  • 3
  • on the second solution the relation needs to be jORgridviewdefinition.RelationalColumn = "InventoryItems". Thanks. – RicEspn Mar 20 '23 at 18:16