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 options using checkboxes and radiobuttons, created using an XML document.
The source code is located at C:\Program Files (x86)\Softelvdm\SftTree NET 2.0\Samples\CSharp\XMLProps.
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 Softelvdm.SftTreeNET;
using Softelvdm.Controls;
namespace XMLProps
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load("..\\..\\XmlFile.xml");
sftTree1.Headers[0,0].Text = "Options";
sftTree1.RowHeaders.Width = 0;
ProcessNodes(doc.ChildNodes, null);
sftTree1.Columns.MakeOptimal(0, false);
sftTree1.RecalcHorizontalExtent();
}
private void ProcessNodes(XmlNodeList xmlNodeList, ItemClass item)
{
// Process all nodes (recursively if neccessary)
foreach (XmlNode elem in xmlNodeList)
{
string id = "";
string desc = "";
try {
id = elem.Attributes["ID"].Value;
desc = elem.Attributes["Desc"].Value;
} catch {
id = desc = "";
}
if (id != "" && desc != "") {
ItemClass newItem = ProcessNode(item, elem, id, desc);
if (elem.ChildNodes != null)
ProcessNodes(elem.ChildNodes, newItem);
} else {
if (elem.ChildNodes != null)
ProcessNodes(elem.ChildNodes, item);
}
}
}
// Process a node, looking for checkboxes and radiobuttons, everyhing else
// is a section title
private ItemClass ProcessNode(ItemClass item, XmlNode elem, string id, string desc)
{
ItemClass newItem;
if (item != null)
newItem = item.Add();
else
newItem = sftTree1.ItemCollection.Add();
newItem.TagObject = id;
if (elem.Name == "Checkbox") {
CheckBoxStateEnum check = CheckBoxStateEnum.Unchecked;
string strcheck = "";
try {
strcheck = elem.Attributes["Status"].Value;
} catch {
strcheck = "";
}
if (strcheck != "")
check = (strcheck != "0") ? CheckBoxStateEnum.Checked : CheckBoxStateEnum.Unchecked;
newItem.Cells[0].Parts.Add(new CheckBoxPartClass(check));
} else if (elem.Name == "Radiobutton") {
RadioButtonStateEnum check = RadioButtonStateEnum.Unchecked;
string strcheck = "";
try {
strcheck = elem.Attributes["Status"].Value;
} catch {
strcheck = "";
}
if (strcheck != "")
check = (strcheck != "0") ? RadioButtonStateEnum.Checked : RadioButtonStateEnum.Unchecked;
newItem.Cells[0].Parts.Add(new RadioButtonPartClass(check));
}
newItem.Cells[0].Text = desc;
return newItem;
}
// Handle the space char to select the checkbox or radiobutton
private void sftTree1_KeyPress(object sender, KeyPressEventArgs e) {
if (e.KeyChar == ' ') {
ItemClass item = sftTree1.FocusItem;
if (item != null) {
GenericPartClass gp = item.Cells[0].Parts[0];
if (gp is CheckBoxPartClass) {
CheckBoxPartClass cb = (CheckBoxPartClass) gp;
cb.State = cb.State == CheckBoxStateEnum.Checked ? CheckBoxStateEnum.Unchecked : CheckBoxStateEnum.Checked;
e.Handled = true;
// changing the checkbox state doesn't automatically call the CheckBoxClicked event
CellClass owningCell = (CellClass)cb.PartOwner;
ItemClass owningItem = owningCell.OwningItem;
sftTree1_CheckBoxClicked(this, new PartEventArgs(owningItem, owningCell, null, cb));
} else if (gp is RadioButtonPartClass) {
RadioButtonPartClass rb = (RadioButtonPartClass)gp;
if (sftTree1.PerformClick_RadioButtonPart(rb)) {
e.Handled = true;
// changing the radiobutton state doesn't automatically call the RadioButtonClicked event
CellClass owningCell = (CellClass) rb.PartOwner;
ItemClass owningItem = owningCell.OwningItem;
sftTree1_RadioButtonClicked(this, new PartEventArgs(owningItem, owningCell, null, rb));
}
}
}
}
}
// Handle the space char, it should select the checkbox or radiobutton
// instead of the tree control's default action which is to change the
// item's selection state.
private void sftTree1_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Space) {
e.Handled = true;
}
}
private void sftTree1_CheckBoxClicked(object sender, PartEventArgs e) {
Debug.Print("The checkbox labeled " + e.Cell.Text + " was clicked.");
}
private void sftTree1_RadioButtonClicked(object sender, PartEventArgs e) {
Debug.Print("The radiobutton labeled " + e.Cell.Text + " was clicked.");
}
}
}