Imports System.Reflection Imports Softelvdm.Controls Imports Softelvdm.SftTreeNET Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load ' This sample demonstrates cell merging. In this sample, vertical merging ' is based on identical cell text (MergeStyle = MergeStyleEnum.SameText). ' To prepare for this sample, create a new project with a blank form and add ' a SftTree/NET control named sftTree1. ' In addition, adjust the following FromFile method to use a (small) bitmap ' that is located on your system. Dim img As Image = Bitmap.FromFile("..\\..\\test.gif") Dim cell As CellClass ' Most of this initialization code could be eliminated by designing the control. ' Here, all header area, footer area and item area cells are simply populated ' with text. The actual cell merging portion happens later on sftTree1.Initializing = True sftTree1.Columns.Count = 5 sftTree1.Headers.Rows = 3 sftTree1.Footers.Rows = 0 For r As Integer = 0 To sftTree1.Headers.Rows - 1 For c As Integer = 0 To sftTree1.Columns.Count - 1 cell = sftTree1.Headers(r, c) ' access each header cell cell.Text = "Column " & c.ToString() ' set the title Next Next Dim item As ItemClass For i As Integer = 0 To 3 item = sftTree1.ItemCollection.Add(New String() {"Text 0", "Text 1", "Text 2", "Text 3", "Text 4"}) item.RowHeader.Text = "Row " & i.ToString() Next ' End of initialization (not relevant for this sample) ' In this sample, vertical merging is based on identical cell text. sftTree1.MergeStyle = MergeStyleEnum.SameText ' set merging default for each column For Each col As ColumnClass In sftTree1.Columns.Collection col.MergeWithLowerDefault = True col.AllowMergeFromUpperDefault = True Next ' set merging default for headers and footers sftTree1.Headers.MergeWithLowerDefault = True sftTree1.Headers.AllowMergeFromUpperDefault = True sftTree1.Footers.MergeWithLowerDefault = True sftTree1.Footers.AllowMergeFromUpperDefault = True ' Horizontally merge column header cells in row 1, columns 1 through 4 For c As Integer = 1 To 4 sftTree1.Headers(1, c).AllowMergeFromPrevious = BoolOptionalEnum.True sftTree1.Headers(1, c).MergeWithNext = BoolOptionalEnum.True sftTree1.Headers(1, c).Parts.Clear() Next sftTree1.Headers(1, 1).Text = "Horizontally merged cells" sftTree1.Headers(1, 1).Image = img ' Horizontally merge cells in the second item (starting at column 1 through last) item = sftTree1.ItemCollection(1) cell = item.Cells(1) Do While Not cell Is Nothing cell.AllowMergeFromPrevious = BoolOptionalEnum.True cell.MergeWithNext = BoolOptionalEnum.True cell.Parts.Clear() cell = cell.NextDisplayed Loop item.Cells(1).Parts.Add(New ImagePartClass(img)) item.Cells(1).Text = "Horizontally merged cells" ' Horizontally merge cells in the third item (starting at column 1 through last) item = sftTree1.ItemCollection(2) cell = item.Cells(1) Do While Not cell Is Nothing cell.AllowMergeFromPrevious = BoolOptionalEnum.True cell.MergeWithNext = BoolOptionalEnum.True cell.Parts.Clear() cell = cell.NextDisplayed Loop item = sftTree1.ItemCollection(2) item.Cells(1).Parts.Add(New ImagePartClass(img)) item.Cells(1).Text = "Another horizontally merged cell" ' Merge 2 row headers, starting at the second item Dim count As Integer = 2 item = sftTree1.ItemCollection(1) Do While Not item Is Nothing And count > 0 Dim rhd As RowHeaderClass = item.RowHeader rhd.AllowMergeFromUpper = BoolOptionalEnum.True rhd.MergeWithLower = BoolOptionalEnum.True rhd.Text = "Merge" count = count - 1 item = item.NextSibling Loop Dim f As Font = New Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Point) sftTree1.ItemCollection(1).RowHeader.TextPart.Font = f sftTree1.ItemCollection(1).RowHeader.TextPart.Format = sftTree1.ItemCollection(1).RowHeader.TextPart.Format Or StringFormatFlags.DirectionVertical sftTree1.ItemCollection(1).RowHeader.Parts.Add(New ImagePartClass(img)) ' Make column widths and row header area width optimal sftTree1.Columns.MakeOptimal(0, False) sftTree1.RowHeaders.MakeOptimal(0, False) ' Activate the horizontal scrollbar sftTree1.RecalcHorizontalExtent() sftTree1.Initializing = False End Sub ' ItemClick event Private Sub sftTree1_ItemClick(ByVal sender As Object, ByVal e As Softelvdm.SftTreeNET.ItemClickEventArgs) Handles sftTree1.ItemClick Debug.Write("** ItemClick") Dim itemIndex As Integer = -1 If Not e.Item Is Nothing Then itemIndex = e.Item.VisibleIndex If itemIndex >= 0 Then Debug.Write(" Row " & itemIndex.ToString()) End If Dim colIndex As Integer = -1 If Not e.Cell Is Nothing Then colIndex = e.Cell.ColumnIndex If colIndex >= 0 Then Debug.Write(" Column " + colIndex.ToString()) End If DumpValues(e) DumpValues(e) End Sub Private Sub sftTree1_ItemDoubleClick(ByVal sender As Object, ByVal e As Softelvdm.SftTreeNET.ItemClickEventArgs) Handles sftTree1.ItemDoubleClick Debug.Write("** ItemDoubleClick") DumpValues(e) End Sub ' This is a small helper routine to show all properties and fields of an object Private Sub DumpValues(ByVal o As Object) Dim api() As PropertyInfo = o.GetType().GetProperties() For Each pi As PropertyInfo In api Debug.Write(" " & pi.Name & " " & pi.GetValue(o, New Object() {})) Next Dim afi() As FieldInfo = o.GetType().GetFields() For Each fi As FieldInfo In afi Dim t As Object = fi.GetValue(o) Dim s As String = "(null)" If Not t Is Nothing Then s = t.ToString() Debug.Write(" " & fi.Name & " " & s) Next Debug.WriteLine("") End Sub End Class