SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftMask/OCX 7.0 - Masked Edit Control
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftPrintPreview/DLL 2.0 - Print Preview Control (discontinued)
SftTree/DLL 7.5 - Tree Control
SftBox/OCX 5.0 - Combo Box Control
SftButton/OCX 3.0 - Button Control
SftDirectory 3.5 - File/Folder Control (discontinued)
SftMask/OCX 7.0 - Masked Edit Control
SftOptions 1.0 - Registry/INI Control (discontinued)
SftPrintPreview/OCX 1.0 - Print Preview Control (discontinued)
SftTabs/OCX 6.5 - Tab Control (VB6 only)
SftTree/OCX 7.5 - Tree Control
SftTabs/NET 6.0 - Tab Control (discontinued)
SftTree/NET 2.0 - Tree Control
This sample demonstrates vertical and horizontal cell merging (MergeStyle = SameText).
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Reflection;
using System.Collections;
using Softelvdm.SftTreeNET;
using Softelvdm.Controls;
namespace WindowsApplication1 {
public partial class MergeSample2 : Form {
public MergeSample2() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
// 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.
Image img = Bitmap.FromFile("..\\..\\test.gif");
CellClass cell;
// 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 (int r = 0 ; r < sftTree1.Headers.Rows ; ++r) {
for (int c = 0; c < sftTree1.Columns.Count; ++c) {
cell = sftTree1.Headers[r, c]; // access each header cell
cell.Text = "Column " + c.ToString(); // set the title
}
}
ItemClass item;
for (int i = 0; i < 4; ++i) {
item = sftTree1.ItemCollection.Add(new string[] { "Text 0", "Text 1", "Text 2", "Text 3", "Text 4" });
item.RowHeader.Text = "Row " + i.ToString();
}
// End of initialization
// In this sample, vertical merging is based on identical cell text.
sftTree1.MergeStyle = MergeStyleEnum.SameText;
// set merging default for each column
foreach (ColumnClass col in sftTree1.Columns.Collection) {
col.MergeWithLowerDefault = true;
col.AllowMergeFromUpperDefault = true;
}
// 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 (int c = 1 ; c <= 4 ; ++c) {
sftTree1.Headers[1, c].AllowMergeFromPrevious = BoolOptionalEnum.True;
sftTree1.Headers[1, c].MergeWithNext = BoolOptionalEnum.True;
sftTree1.Headers[1, c].Parts.Clear();
}
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];
for (cell = item.Cells[1]; cell != null; cell = cell.NextDisplayed) {
cell.AllowMergeFromPrevious = BoolOptionalEnum.True;
cell.MergeWithNext = BoolOptionalEnum.True;
cell.Parts.Clear();
}
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];
for (cell = item.Cells[1]; cell != null; cell = cell.NextDisplayed) {
cell.AllowMergeFromPrevious = BoolOptionalEnum.True;
cell.MergeWithNext = BoolOptionalEnum.True;
cell.Parts.Clear();
}
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
int count = 2;
for (item = sftTree1.ItemCollection[1]; item != null && count > 0; count--, item = item.NextSibling) {
RowHeaderClass rhd = item.RowHeader;
rhd.AllowMergeFromUpper = BoolOptionalEnum.True;
rhd.MergeWithLower = BoolOptionalEnum.True;
rhd.Text = "Merge";
}
Font f = new Font("Arial", 8, FontStyle.Bold, GraphicsUnit.Point);
sftTree1.ItemCollection[1].RowHeader.TextPart.Font = f;
sftTree1.ItemCollection[1].RowHeader.TextPart.Format |= 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;
}
// ItemClick event
private void sftTree1_ItemClick(object sender, ItemClickEventArgs e) {
Debug.Write("** ItemClick");
int itemIndex = -1;
if (e.Item != null)
itemIndex = e.Item.VisibleIndex;
if (itemIndex >= 0)
Debug.Write(" Row " + itemIndex.ToString());
int colIndex = -1;
if (e.Cell != null)
colIndex = e.Cell.ColumnIndex;
if (colIndex >= 0)
Debug.Write(" Column " + colIndex.ToString());
DumpValues(e);
}
private void sftTree1_ItemDoubleClick(object sender, ItemClickEventArgs e) {
Debug.Write("** ItemDoubleClick");
DumpValues(e);
}
// This is a small helper routine to show all properties and fields of an object
private void DumpValues(object o) {
PropertyInfo[] api = o.GetType().GetProperties();
foreach (PropertyInfo pi in api)
Debug.Write(" " + pi.Name + " " + pi.GetValue(o, new object[] ));
FieldInfo[] afi = o.GetType().GetFields();
foreach (FieldInfo fi in afi)
Debug.Write(" " + fi.Name + " " + fi.GetValue(o));
Debug.WriteLine("");
}
}
}