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 illustrates sorting, column reordering, responding to column header clicks, context menus, controlling expand/collapse buttons and plus/minus graphics.
The source code is located at C:\Program Files (x86)\Softelvdm\SftTree OCX 7.5\Samples\Visual Studio - CSharp\BookTable\Form1.cs or C:\Program Files\Softelvdm\SftTree OCX 7.5\Samples\Visual Studio - CSharp\BookTable\Form1.cs (on 32-bit Windows versions).
private void button1_Click(object sender, System.EventArgs e) {
Application.Exit();
}
private void Form1_Load(object sender, System.EventArgs e) {
axSftTree1.BulkUpdate = true;
// set default item graphic. This can also be done at design time
axSftTree1.Items.ItemImageExpandable.SetImageListH((long)itemImageList.Handle, 0);
axSftTree1.Items.ItemImageExpanded.SetImageListH((long)itemImageList.Handle, 1);
axSftTree1.Items.ItemImageLeaf.SetImageListH((long)itemImageList.Handle, 2);
// set the column header sort indicators
axSftTree1.Headers.SortIndicators = SftTreeHeaderSortIndicatorsConstants.headerSortIndicatorsSftTreeAuto;
axSftTree1.get_Header(0).SortIndicator = SftTreeSortIndicatorConstants.sortIndicatorSftTreeAscending;
Random random = new Random();
// set the cell font for books
Font fnt = new Font(axSftTree1.Font, FontStyle.Bold);
stdole.IFontDisp pFont = OLECvt.ToIFontDisp(fnt);
for (int bk = 1 ; bk <= 4 ; ++bk) {
// add a book
int bookIndex = axSftTree1.Items.Add("Book " + bk.ToString());
axSftTree1.get_Cell(bookIndex, 1).Text = "Description for book " + bk.ToString();
int size = random.Next(1, bk == 1 ? 99 : 999);
axSftTree1.get_Cell(bookIndex, 2).Text = size.ToString();
axSftTree1.get_Item(bookIndex).Data = size;
// add chapters
for (int ch = 1 ; ch <= 2 ; ++ch) {
int index = axSftTree1.Items.Add("Chapter " + ch.ToString());
axSftTree1.get_Item(index).Level = 1;
// add sections
for (int sect = 1 ; sect <= 2 ; ++sect) {
index = axSftTree1.Items.Add("Section " + sect.ToString());
axSftTree1.get_Item(index).Level = 2;
}
}
// after adding the book and all dependent items, we
// collapse the item, so it's up to the user to expand it
axSftTree1.get_Item(bookIndex).Collapse(false);
// set font
axSftTree1.get_Cell(bookIndex, 0).Font = pFont;
}
// End of Mass-Update
axSftTree1.BulkUpdate = false;
// Make columns optimal
axSftTree1.ColumnsObj.MakeOptimal();
// allow horizontal scrolling
axSftTree1.Items.RecalcHorizontalExtent();
}
private void plusMinusCheckBox_CheckedChanged(object sender, System.EventArgs e) {
if (plusMinusCheckBox.Checked) {
axSftTree1.Items.PlusMinusImageExpandable.NETImageObject = plusMinusImageList.Images[0];
axSftTree1.Items.PlusMinusImageExpanded.NETImageObject = plusMinusImageList.Images[1];
} else {
axSftTree1.Items.PlusMinusImageExpandable.Clear();
axSftTree1.Items.PlusMinusImageExpanded.Clear();
}
}
private void uglyCheckBox_CheckedChanged(object sender, System.EventArgs e) {
if (uglyCheckBox.Checked)
axSftTree1.ButtonPicture = buttonImageList.Images[0];
else
axSftTree1.ButtonPicture = null;
}
private void SortHeader(short ColNum) {
// get the new, sorted column
short sortedColumn = axSftTree1.Headers.SortedColumn;
// Sort the data based on the sort indicator
// Note that column 2 is sorted by Item.Data, which is an integer value (book size in pages)
if (axSftTree1.get_Header(sortedColumn).SortIndicator == SftTreeSortIndicatorConstants.sortIndicatorSftTreeAscending) {
if (sortedColumn == 2)
axSftTree1.Items.SortDependents(-1, sortedColumn, SftTreeSortTypeConstants.sortSftTreeAscItemData);
else
axSftTree1.Items.SortDependents(-1, sortedColumn, SftTreeSortTypeConstants.sortSftTreeAscending);
} else {
// Sort the data. Note that column 2 is sorted by Item.Data, which is
// an integer value (book size in pages)
if (sortedColumn == 2)
axSftTree1.Items.SortDependents(-1, sortedColumn, SftTreeSortTypeConstants.sortSftTreeDscItemData);
else
axSftTree1.Items.SortDependents(-1, sortedColumn, SftTreeSortTypeConstants.sortSftTreeDescending);
}
}
private void axSftTree1_ItemClick(object sender, AxSftTreeLib75._DSftTreeEvents_ItemClickEvent e) {
SftTreeAreaTypeConstants area = (SftTreeAreaTypeConstants) e.areaType;
SftTreeButtonConstants button = (SftTreeButtonConstants) e.button;
// respond to click in column header with left mouse button
if (area == SftTreeAreaTypeConstants.constSftTreeColumn && button == SftTreeButtonConstants.constSftTreeLeftButton)
SortHeader(e.colIndex);
else if (area == SftTreeAreaTypeConstants.constSftTreeExpandAll)
axSftTree1.get_Item(e.itemIndex).Expand(false, true);
}
private void axSftTree1_ItemDblClick(object sender, AxSftTreeLib75._DSftTreeEvents_ItemDblClickEvent e) {
// Respond to click in column header with left mouse button
SftTreeAreaTypeConstants area = (SftTreeAreaTypeConstants) e.areaType;
SftTreeButtonConstants button = (SftTreeButtonConstants) e.button;
if (area == SftTreeAreaTypeConstants.constSftTreeColumnRes && button == SftTreeButtonConstants.constSftTreeLeftButton) {
axSftTree1.get_Column(e.colIndex).MakeOptimal();
axSftTree1.Items.RecalcHorizontalExtent();
} else if (area == SftTreeAreaTypeConstants.constSftTreeColumn && button == SftTreeButtonConstants.constSftTreeLeftButton)
SortHeader(e.colIndex);
}
private void menuItem1_Click(object sender, System.EventArgs e) {
MessageBox.Show("This sample doesn't implement any actions for the item menu. Try the column headers instead.");
}
private void menuItem2_Click(object sender, System.EventArgs e) {
MessageBox.Show("This sample doesn't implement any actions for the item menu. Try the column headers instead.");
}
private void menuItem3_Click(object sender, System.EventArgs e) {
MessageBox.Show("This sample doesn't implement any actions for the item menu. Try the column headers instead.");
}
private void menuItem4_Click(object sender, System.EventArgs e) {
MessageBox.Show("This sample doesn't implement any actions for the item menu. Try the column headers instead.");
}
private void axSftTree1_ContextMenuEvent(object sender, AxSftTreeLib75._DSftTreeEvents_ContextMenuEvent e)
{
Point point = axSftTree1.PointToScreen(new Point(e.x, e.y));
// Determine click context menu for header or item
int l, t, h, w;
axSftTree1.Headers.GetPositionPix(out l, out t, out w, out h);
if (e.x >= l && e.x < l + w && e.y >= t && e.y <= t + h) {
HeaderMenu(PointToClient(point));
return;
}
// determine item right-clicked
int ItemIndex = axSftTree1.Items.HitTestPix(e.x, e.y);
if (ItemIndex >= 0 && ItemIndex < axSftTree1.Items.Count) {
axSftTree1.Items.Current = ItemIndex;
axSftTree1.get_Item(ItemIndex).Selected = true;
axSftTree1.CancelMode();
ItemContextMenu.Show(this, PointToClient(point));
}
}
private void menuHeader_Click(object sender, System.EventArgs e) {
MenuItem mItem = (MenuItem) sender;
short colIndex = (short) mItem.Index;
if (mItem.Checked)
axSftTree1.get_Column(colIndex).WidthPix = 0;
else
axSftTree1.get_Column(colIndex).MakeOptimal();
axSftTree1.Items.RecalcHorizontalExtent();
mItem.Checked = !mItem.Checked;
}
private void menuHeaderShowAll_Click(object sender, System.EventArgs e) {
axSftTree1.ColumnsObj.MakeOptimal();
}
private void HeaderMenu(Point cursor) {
System.Windows.Forms.ContextMenu menu = new ContextMenu();
System.Windows.Forms.MenuItem mItem;
int count = 0;
for (short c = 0 ; c < axSftTree1.ColumnsObj.Count ; ++c) {
mItem = new System.Windows.Forms.MenuItem();
mItem.Text = axSftTree1.get_Header(c).Text;
if (axSftTree1.get_Column(c).WidthPix > 0) {
mItem.Checked = true;
++count;
} else
mItem.Checked = false;
mItem.Click += new System.EventHandler(menuHeader_Click);
menu.MenuItems.Add(mItem);
}
if (count <= 1) {
for (short c = 0 ; c < axSftTree1.ColumnsObj.Count ; ++c) {
if (menu.MenuItems[c].Checked)
menu.MenuItems[c].Enabled = false;
else
menu.MenuItems[c].Enabled = true;
}
}
mItem = new System.Windows.Forms.MenuItem("-");
menu.MenuItems.Add(mItem);
mItem = new System.Windows.Forms.MenuItem("&Show All");
mItem.Enabled = (count < axSftTree1.ColumnsObj.Count);
mItem.Click += new System.EventHandler(menuHeaderShowAll_Click);
menu.MenuItems.Add(mItem);
axSftTree1.CancelMode();
menu.Show(this, cursor);
}
}
}