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 shows dynamic loading ("load as you go") of the tree control.
The source code is located at C:\Program Files (x86)\Softelvdm\SftTree NET 2.0\Samples\CSharp\ExploreAssembly.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Diagnostics;
using System.Reflection;
using Softelvdm.SftTreeNET;
using Softelvdm.Controls;
namespace ExploreAssembly
{
public partial class Form1 : Form
{
// This example implements dynamically populating the tree control ("load as you go").
// As items are added, they are marked as expandable (ExpandCollapseButton =
// ExpandCollapseButtonStyleEnum.Show, even though no child items are added (yet).
// Once the user clicks on the expand/collapse button, the child items are added.
// The data displayed is created by loading an assembly and displaying defined
// types.
public Form1()
{
InitializeComponent();
}
const BindingFlags bFlags = BindingFlags.FlattenHierarchy | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static;
private void CloseButton_Click(object sender, EventArgs e) {
Close();
}
private void LoadButton_Click(object sender, EventArgs e) {
openFileDialog1.ShowDialog();
}
private void openFileDialog1_FileOk(object sender, CancelEventArgs e) {
LoadAssembly(openFileDialog1.FileName);
}
private void LoadAssembly(Assembly asm) {
sftTree1.Initializing = true;
ItemCollectionClass itemCollection = sftTree1.ItemCollection;
itemCollection.Clear();
ListInfo(itemCollection, asm);
itemCollection.Sort();
sftTree1.Headers[0, 0].Text = asm.FullName;
sftTree1.Columns.MakeOptimal(0, true);
sftTree1.RecalcHorizontalExtent();
sftTree1.Initializing = false;
}
private void LoadAssembly(string newInputFile)
{
Assembly asm = null;
try {
asm = Assembly.LoadFrom(newInputFile);
} catch (Exception e) {
MessageBox.Show(e.Message);
return;
}
LoadAssembly(asm);
}
private void ListInfo(ItemCollectionClass itemCollection, Assembly a) {
ItemClass item = itemCollection.Add("Custom Attributes");
item.TagObjects = a.GetCustomAttributes(true);
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Exported Types");
item.TagObjects = a.GetExportedTypes();
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Files");
item.TagObjects = a.GetFiles();
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Manifest Resource Names ");
item.TagObjects = a.GetManifestResourceNames();
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Properties");
PropertyInfo[] props = typeof(Assembly).GetProperties(bFlags);
foreach (PropertyInfo p in props) {
string sval = "";
try {
object val = p.GetValue(a, null);
if (val != null)
sval = val.ToString();
else
sval = "(null)";
} catch {
sval = "(?)";
}
item.Add(new string[] { p.Name, sval });
}
item.Children.Sort();
}
private void ListInfo(ItemCollectionClass itemCollection, object o) {
Type tp = o.GetType();
ItemClass item = itemCollection.Add("Custom Attributes");
item.TagObjects = tp.GetCustomAttributes(true);
item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show;
item = itemCollection.Add("Events");
item.TagObjects = tp.GetEvents(bFlags);
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Fields");
item.TagObjects = tp.GetFields(bFlags);
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Interfaces");
item.TagObjects = tp.GetInterfaces();
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Members");
item.TagObjects = tp.GetMembers(bFlags);
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Methods");
item.TagObjects = tp.GetMethods(bFlags);
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Nested Types");
item.TagObjects = tp.GetNestedTypes(bFlags);
item.ExpandCollapseButton = item.TagObjects.Length > 0 ? ExpandCollapseButtonStyleEnum.Show : ExpandCollapseButtonStyleEnum.Hide;
item = itemCollection.Add("Properties");
PropertyInfo[] props = tp.GetProperties(bFlags);
foreach (PropertyInfo p in props) {
string sval = "";
try {
object val = p.GetValue(o, null);
if (val != null)
sval = val.ToString();
else
sval = "(null)";
} catch {
sval = "(?)";
}
item.Add(new string[] { p.Name, sval });
}
item.Children.Sort();
}
private void Form1_Load(object sender, EventArgs e) {
sftTree1.Columns.Count = 2;
sftTree1.Headers.Reorderable = sftTree1.Footers.Reorderable = false;
sftTree1.Headers.MergeWithNextDefault = true;
sftTree1.Headers.AllowMergeFromPreviousDefault = true;
sftTree1.Columns[0].MergeWithNextDefault = true;
sftTree1.Columns[1].AllowMergeFromPreviousDefault = true;
sftTree1.MergeStyle = MergeStyleEnum.EmptyCells;
sftTree1.AutoRespond = false;
sftTree1.RowHeaders.Width = 0;
LoadAssembly(Assembly.GetExecutingAssembly());
}
private void ExpandCollapseItem(ItemClass item)
{
if (item.Expanded)
item.Collapse(CollapseStyleEnum.SaveCurrent);
else {
if (item.HasChildren)
item.Expand(ExpandStyleEnum.RestoreLast);
else {
sftTree1.Initializing = true;
if (item.TagString == "Single") {
item._CreateChildren = true;
ListInfo(item.Children, item.TagObject);
} else {
foreach (object o in item.TagObjects) {
ItemClass newItem = item.Add(o.ToString());
newItem.TagObject = o;
newItem.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Show;
newItem.TagString = "Single";
}
}
if (item.HasChildren)
item.Children.Sort();
item.ExpandCollapseButton = ExpandCollapseButtonStyleEnum.Conditional;
item.Expand(ExpandStyleEnum.DirectOnly);
sftTree1.Initializing = false;
}
}
sftTree1.Columns.MakeOptimal(0, true);
sftTree1.RecalcHorizontalExtent();
}
private void sftTree1_ItemClick(object sender, ItemClickEventArgs e) {
Debug.Write("ItemClick ");
DumpValues(e);
// user clicks expand/collapse button
if (e.Area == ItemClickAreaEnum.ExpandCollapseButton && e.Item != null) {
ExpandCollapseItem(e.Item);
}
}
private void sftTree1_ItemDoubleClick(object sender, ItemClickEventArgs e) {
Debug.Write("ItemDoubleClick ");
DumpValues(e);
// user double clicks on an item
if (e.Area == ItemClickAreaEnum.CellSel && e.Item != null) {
ExpandCollapseItem(e.Item);
}
}
private void sftTree1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Right) {
// Right arrow normally expands a parent item. Our items don't (yet) have
// child items, so we'll have to handle the right arrow keys.
ItemClass item = sftTree1.FocusItem;
if (item != null) {
if (item.ExpandCollapseButton == ExpandCollapseButtonStyleEnum.Show) {
ExpandCollapseItem(item);
e.Handled = true;
}
}
}
}
// 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("");
}
private void sftTree1_Click(object sender, EventArgs e) {
}
}
}