In the previous step you created a Silverlight application and added the C1OrgChart control to your project. In this step you'll add content to the C1OrgChart control. Note that in this step you will add code files that is included with the ComponentOne Studio for Silverlight samples, which are by default installed in the Documents or MyDocuments folder in the ComponentOne Samples\Studio for Silverlight \C1.Silverlight.OrgChart\OrgChart_Demo directory. The code is included here as well, or you can locate and add the code file as a shortcut. To customize your project and add content to the C1OrgChart control in your application, complete the following steps:
1. In the Solution Explorer, right-click the MainPage.xaml file and select View Code. The code file will open.
2. Edit the code file so that it appears similar to the following:
Partial Public Class MainPage
Inherits UserControl
Public Sub New()
InitializeComponent()
CreateData()
End Sub
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
CreateData()
End Sub
Private Sub CheckBox_Click(sender As Object, e As RoutedEventArgs)
_orgChart.Orientation = If(DirectCast(sender, CheckBox).IsChecked.Value, Orientation.Horizontal, Orientation.Vertical)
End Sub
Private Sub CreateData()
Dim p = Data.Person.CreatePerson(10)
_tbTotal.Text = String.Format(" ({0} items total)", p.TotalCount)
_orgChart.Header = p
End Sub
End Class
Public Class PersonTemplateSelector
Inherits C1.Silverlight.OrgChart.DataTemplateSelector
Public Overrides Function SelectTemplate(item As Object, container As DependencyObject) As DataTemplate
Dim p = TryCast(item, Data.Person)
Dim e = TryCast(Application.Current.RootVisual, FrameworkElement)
Return If(p.Position.IndexOf("Director") > -1, TryCast(e.Resources("_tplDirector"), DataTemplate), TryCast(e.Resources("_tplOther"), DataTemplate))
End Function
End Class
•C#
namespace QuickStart
{
public partial class MainPage : UserControl
{
public MainPage ()
{
InitializeComponent();
CreateData();
}
void Button_Click(object sender, RoutedEventArgs e)
{
CreateData();
}
void CheckBox_Click(object sender, RoutedEventArgs e)
{
_orgChart.Orientation = ((CheckBox)sender).IsChecked.Value
? Orientation.Horizontal
: Orientation.Vertical;
}
void CreateData()
{
var p = Data.Person.CreatePerson(10);
_tbTotal.Text = string.Format(" ({0} items total)", p.TotalCount);
_orgChart.Header = p;
}
}
public class PersonTemplateSelector : C1.Silverlight.OrgChart.DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
var p = item as Data.Person;
var e = Application.Current.RootVisual as FrameworkElement;
return p.Position.IndexOf("Director") > -1
? e.Resources["_tplDirector"] as DataTemplate
: e.Resources["_tplOther"] as DataTemplate;
}
}
}
3. Navigate to the Solution Explorer, right-click the project name, and select Add │ New Item. In the Add New Item dialog box, locate the Code File template, name it "EnumerationExtension", and click Add.
The new code file will open. Note that this code file is also included with the sample, if you choose you can simply add that file.
4. Add the following code to the EnumerationExtension code file :
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Markup
Imports System.Reflection
Imports System.Collections.Generic
Namespace Util
Public Class EnumerationExtension
Inherits MarkupExtension
Public Property EnumType() As Type
Get
Return m_EnumType
End Get
Set(value As Type)
m_EnumType = Value
End Set
End Property
Private m_EnumType As Type
Public Overrides Function ProvideValue(serviceProvider As IServiceProvider) As Object
Dim list = New List(Of Object)()
For Each value In EnumType.GetFields(BindingFlags.[Public] Or BindingFlags.[Static])
list.Add(value.GetValue(Nothing))
Next
Return list
End Function
End Class
End Namespace
•C#
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
using System.Reflection;
using System.Collections.Generic;
namespace Util
{
public class EnumerationExtension : MarkupExtension
{
public Type EnumType { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var list = new List<object>();
foreach (var value in EnumType.GetFields(BindingFlags.Public | BindingFlags.Static))
{
list.Add(value.GetValue(null));
}
return list;
}
}
}
This code allows you to bind the ComboBox controls to enumeration values so at run time you can choose a bound value to set.
5. Navigate to the Solution Explorer, right-click the project name, and select Add │ New Item. In the Add New Item dialog box, locate the Code File template, name it "Person", and click Add.
The new code file will open. Note that this code file is also included with the sample, if you choose you can simply add that file.
6. Add the following code to the Person code file:
Imports System.Collections
Imports System.Collections.Generic
Imports System.Collections.ObjectModel
Namespace Data
Public Class Person
Private _list As New ObservableCollection(Of Person)()
#Region "** object model"
Public Property Name() As String
Get
Return m_Name
End Get
Set(value As String)
m_Name = Value
End Set
End Property
Private m_Name As String
Public Property Position() As String
Get
Return m_Position
End Get
Set(value As String)
m_Position = Value
End Set
End Property
Private m_Position As String
Public Property Notes() As String
Get
Return m_Notes
End Get
Set(value As String)
m_Notes = Value
End Set
End Property
Private m_Notes As String
Public ReadOnly Property Subordinates() As IList(Of Person)
Get
Return _list
End Get
End Property
Public ReadOnly Property TotalCount() As Integer
Get
Dim count = 1
For Each p In Subordinates
count += p.TotalCount
Next
Return count
End Get
End Property
Public Overrides Function ToString() As String
Return String.Format("{0}:" & vbCr & vbLf & vbTab & "{1}", Name, Position)
End Function
#End Region
#Region "** Person factory"
Shared _rnd As New Random()
Shared _positions As String() = "Director|Manager|Designer|Developer|Writer|Assistant".Split("|"c)
Shared _areas As String() = "Development|Marketing|Sales|Support|Accounting".Split("|"c)
Shared _first As String() = "John|Paul|Dan|Dave|Rich|Mark|Greg|Erin|Susan|Sarah|Tim|Trevor|Kevin|Mark|Dewey|Huey|Larry|Moe|Curly|Adam|Albert".Split("|"c)
Shared _last As String() = "Smith|Doe|Williams|Sorensen|Hansen|Mandela|Johnson|Ward|Woodman|Jordan|Mays|Kevorkian|Trudeau|Hendrix|Clinton".Split("|"c)
Shared _verb As String() = "likes|reads|studies|hates|exercises|dreams|plays|writes|argues|sleeps|ignores".Split("|"c)
Shared _adjective As String() = "long|short|important|pompous|hard|complex|advanced|modern|boring|strange|curious|obsolete|bizarre".Split("|"c)
Shared _noun As String() = "products|tasks|goals|campaigns|books|computers|people|meetings|food|jokes|accomplishments|screens|pages".Split("|"c)
Public Shared Function CreatePerson(level As Integer) As Person
Dim p = CreatePerson()
If level > 0 Then
level -= 1
For i As Integer = 0 To _rnd.[Next](1, 4) - 1
p.Subordinates.Add(CreatePerson(_rnd.[Next](level \ 2, level)))
Next
End If
Return p
End Function
Public Shared Function CreatePerson() As Person
Dim p = New Person()
p.Position = String.Format("{0} of {1}", GetItem(_positions), GetItem(_areas))
p.Name = String.Format("{0} {1}", GetItem(_first), GetItem(_last))
p.Notes = String.Format("{0} {1} {2} {3}", p.Name, GetItem(_verb), GetItem(_adjective), GetItem(_noun))
While _rnd.NextDouble() < 0.5
p.Notes += String.Format(" and {0} {1} {2}", GetItem(_verb), GetItem(_adjective), GetItem(_noun))
End While
p.Notes += "."
Return p
End Function
Private Shared Function GetItem(list As String()) As String
Return list(_rnd.[Next](0, list.Length))
End Function
#End Region
End Class
End Namespace
•C#
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
namespace Data
{
public class Person
{
ObservableCollection<Person> _list = new ObservableCollection<Person>();
#region ** object model
public string Name { get; set; }
public string Position { get; set; }
public string Notes { get; set; }
public IList<Person> Subordinates
{
get { return _list; }
}
public int TotalCount
{
get
{
var count = 1;
foreach (var p in Subordinates)
{
count += p.TotalCount;
}
return count;
}
}
public override string ToString()
{
return string.Format("{0}:\r\n\t{1}", Name, Position);
}
#endregion
#region ** Person factory
static Random _rnd = new Random();
static string[] _positions = "Director|Manager|Designer|Developer|Writer|Assistant".Split('|');
static string[] _areas = "Development|Marketing|Sales|Support|Accounting".Split('|');
static string[] _first = "John|Paul|Dan|Dave|Rich|Mark|Greg|Erin|Susan|Sarah|Tim|Trevor|Kevin|Mark|Dewey|Huey|Larry|Moe|Curly|Adam|Albert".Split('|');
static string[] _last = "Smith|Doe|Williams|Sorensen|Hansen|Mandela|Johnson|Ward|Woodman|Jordan|Mays|Kevorkian|Trudeau|Hendrix|Clinton".Split('|');
static string[] _verb = "likes|reads|studies|hates|exercises|dreams|plays|writes|argues|sleeps|ignores".Split('|');
static string[] _adjective = "long|short|important|pompous|hard|complex|advanced|modern|boring|strange|curious|obsolete|bizarre".Split('|');
static string[] _noun = "products|tasks|goals|campaigns|books|computers|people|meetings|food|jokes|accomplishments|screens|pages".Split('|');
public static Person CreatePerson(int level)
{
var p = CreatePerson();
if (level > 0)
{
level--;
for (int i = 0; i < _rnd.Next(1, 4); i++)
{
p.Subordinates.Add(CreatePerson(_rnd.Next(level / 2, level)));
}
}
return p;
}
public static Person CreatePerson()
{
var p = new Person();
p.Position = string.Format("{0} of {1}", GetItem(_positions), GetItem(_areas));
p.Name = string.Format("{0} {1}", GetItem(_first), GetItem(_last));
p.Notes = string.Format("{0} {1} {2} {3}", p.Name, GetItem(_verb), GetItem(_adjective), GetItem(_noun));
while (_rnd.NextDouble() < .5)
{
p.Notes += string.Format(" and {0} {1} {2}", GetItem(_verb), GetItem(_adjective), GetItem(_noun));
}
p.Notes += ".";
return p;
}
static string GetItem(string[] list)
{
return list[_rnd.Next(0, list.Length)];
}
#endregion
}
}
This code creates a simple class with a recursive ObservableCollection for items to be displayed in C1OrgChart and creates a method to build a simple organization chart. Note that the C1OrgChart control's default template uses the ToString method to dictate what text is displayed. You will need to override this method (as in the above code) if you're not using a DataTemplate (if you are using a DataTemplate, you can just set your bindings in that and ignore the ToString).
In this step you added content to the C1OrgChart control. In the next step you'll view some of the run-time interactions possible in the control.