Hi all,
I've been stuck for a while trying to setup our WHDG. We have a dynamic, changing, dataset object coming back from our databases. This can have N relationships and tables in it. We must create the bands manually so that we can hide columns and format the display.
Note: If I set the grid to auto create the bands, it works fine but the display is no good for our needs.
However, if I try to create a band for each dataTable in the set then the 2nd level + band I create are not used.
Also, if I create the bands manually but leave AutoGenerateBands="True" then the 2nd level band has no formatting.
Is there some way I can view the auto generated bands in code? If so then maybe I could see what was wrong with my setup.
This is the function I used to setup the bands:
Protected Overrides Sub OnInit(ByVal e As EventArgs)
Dim i As Integer = 1 ' skip root band/table (this is already setup in the grid)
While i < Me.WHDG1.DataSource.Tables.Count
Dim band As New Infragistics.Web.UI.GridControls.Band
Dim table As New DataTable
table = Me.WHDG1.DataSource.Tables(i)
Me.WHDG1.Bands.Add(band)
band.DataMember = table.TableName
band.Key = table.TableName
band.DataKeyFields = "Autoid"
band.ShowHeader = False
band.AutoGenerateColumns = False
addDataField("Sel", "Sel", "20", False, "columnClassSel", table, band)
addDataField("Sel1", "Sel", "20", False, "columnClassSel", table, band)
addDataField("Sel2", "Sel", "20", False, "columnClassSel", table, band)
addDataField("Sel3", "Sel", "20", False, "columnClassSel", table, band)
addDataField("Sel4", "Sel", "20", False, "columnClassSel", table, band)
addDataField("Sel5", "Sel", "20", False, "columnClassSel", table, band)
addDataField("Sel6", "Sel", "20", False, "columnClassSel", table, band)
addDataField("display", "display", "", False, "", table, band)
addDataField("Available", "Available", "70", False, "columnClassAvailable", table, band)
addDataField("name", "name", "", True, "", table, band)
addDataField("parenttable", "parenttable", "", True, "", table, band)
addDataField("parentkey", "parentkey", "", True, "", table, band)
addDataField("childtable", "childtable", "", True, "", table, band)
addDataField("level", "level", "", True, "", table, band)
addDataField("filter", "filter", "", True, "", table, band)
addDataField("incex", "incex", "", True, "", table, band)
addDataField("tbl", "tbl", "", True, "", table, band)
addDataField("bandkey", "bandkey", "", True, "", table, band)
i = i + 1
End While
Private Sub addDataField(ByVal fieldName As String, ByVal key As String, ByVal width As String, ByVal hidden As Boolean, ByVal cssClass As String, ByRef table As DataTable, ByRef band As Infragistics.Web.UI.GridControls.Band)
If table.Columns.Contains(fieldName) Then
Dim dataField As Infragistics.Web.UI.GridControls.BoundDataField = New Infragistics.Web.UI.GridControls.BoundDataField
dataField.DataFieldName = fieldName
dataField.Key = fieldName
dataField.Hidden = hidden
dataField.CssClass = cssClass
If Not width = "" Then
dataField.Width = width
End If
band.Columns.Add(dataField)
End Sub
I am having similar issues. There are about a dozen different ways to bind the grid and I've tried them all twice. It seems that no matter what I do to format anything with the grid prior to binding is completely ignored. If I set autogeneratecolumns=false, then the grid is blank. I've tried the ThreeLevelsonManualLoad example, creating my webhierarchicaldatasource inline and the code behind, binding to a relational dataset....all of them will create the grid with a parent/child band as expected, but if I try to set column width or change a caption prior to binding, its ignored. We have the exact same code in the webdatagrid and it works correctly. Is this a bug with the webhierarchicalgrid?
Okay, I've got a little further with this now (thanks to trial and error, not thanks to any kind of Infragistics "support")
The WHDG will only happily use the bands you supply it if their layout and setup if perfect. This is why it's not displaying anything if you set it's AutoGenerateBands / Columns to "False"
The thing that caught me out with the bands was that they are hierarchical in nature. So say you have a grid with 3 levels:
Level 0 you do not make a band for, you set this up as the Columns of the grid itself
Level 1 you create a band for
Level 2 you create a band and insert it into the band collection of Level 1, not into the collection of bands for the WHDG itself.
A good way to troubleshoot the band setup is to set the grid to auto gen your bands and remove any code you have to make bands yourself. The handle a grid event, such as "OnUnload" and stop the debugger there. Have a look at the Bands collection it's autogenerated and make sure your manual band creation code matches this. I made a recusive function to do this:
(ignore code sketchyness plz)
Private Function populateBand(ByRef parentBand As Infragistics.Web.UI.GridControls.Band, ByVal i As Integer)
If i < Me.UltraWebGrid1.DataSource.Tables.Count Then
table = Me.UltraWebGrid1.DataSource.Tables(i)
band.DataKeyFields = "name"
' check if this is a band
Try
Dim str1 As String = table.Rows(0).Item(table.Columns.IndexOf("bandkey"))
Dim str2 As String = "x"
If Not String.Compare(str1, str2) = 0 Then
Catch ex As Exception
End Try
parentBand.Bands.Add(band)
' Revusivly add bands into this band
populateBand(band, i)
End Function