今回紹介するコンポーネント
ComponentOne StudioはWFP、Windows Forms、UWPといったさまざまなアプリケーションに便利な機能を追加できるコンポーネント集です。今回紹介するのは、Windows Formsアプリケーションにツリービュー機能を追加できるコンポーネントがTreeView for WinFormsです。
2017年5月にリリースされた「ComponentOne Studio 2017J v1」では、TreeView for WinFormsの新機能「カスタムノードの表示」が追加され、より便利になりました。
2017年7月にリリースされた最新版「ComponentOne Studio 2017J v2」では、前回の記事で取り上げたGanttView for WinFormの新機能など、さらに便利な機能が拡充されています。
TreeView for WinForms
TreeView for WinFormsは、Windows Formsアプリケーションに高い拡張性を持ったツリービューを追加することができるコンポーネントです。標準のコントロールにはない機能を多く備えています。
新機能としてノードのカスタマイズが可能となりました。これにより、ツリービューの見た目を柔軟にカスタマイズすることができます。本記事でもノードのカスタマイズについて紹介します。
機能の概要は以下の公式ページを参考にしてください。
また本記事のサンプルを実行する際は、公式のドキュメントも参考にしてください。
対象読者
Visual Studioを利用してアプリケーションを作成した経験がある、またはC#、Visual Basicなどの.NET系言語での開発経験がある方。
必要な環境
TreeView for WinFormsを利用するには以下の環境が必要となります。
- Visual Studio 2012/2013/2015/2017 日本語版
- .NET Framework 4.5.2/4.6/4.6.1/4.6.2/4.7
本記事はVisual Studio Enterprise 2017、.NET Framework 4.6環境で画像キャプチャーの取得、動作検証を行っています。
ComponentOne Studioの導入
すでにComponentOne Studioを導入済みの場合も、アカウントでサインイン後に「ダウンロード」→「製品版」から最新のComponentOne Studioをダウンロードしてください。
トライアル版として導入する場合は、以下のURLのフォームからトライアル版を申し込んでください。
フォームに入力したメールアドレスにトライアル版のダウンロードアドレスが送信されるので、それを元にダウンロードを行います。
ComponentOne Studioのインストール
ダウンロードしたZipファイルを展開し、解凍されたファイルからC1StudiosInstaller.exeをダブルクリックしてインストーラーを起動します。
「ComponentOne Studioのインストール」ボタンをクリックします。
導入するプラットフォームを選択します。
今回はWinFormsを選択し右下の「次へ」をクリックします。各プラットフォームに赤い三角とエクスクラメーションマークのアイコンが出ている場合、すでにインストールされているコンポーネントを上書きするという警告です。新規インストール時は表示されていません。
以下の画面が表示されれば、インストールの完了です。「完了」ボタンを押してウィンドウを閉じます。
TreeView for WinFormsを使ってみる
それでは簡単なサンプルを作成してみましょう。
Visual Studioを起動し上部メニューの「ファイル」→「新規作成」→「プロジェクト」をクリックします。
プロジェクトの作成
「新しいプロジェクト」ポップアップウィンドウの左ナビから「インストール済み」→「テンプレート」→「Visual C#」→「Windows クラシック デスクトップ」を選択し、中央の一覧から「Windows フォーム アプリケーション」テンプレートを選択します。
名前の項目は任意ですが、本記では「TreeViewSample」という名前でプロジェクトを作成して進めます。
ウィンドウの右下「OK」をクリックします。
コントロールの追加
これまでTreeView for WinFormsを利用したことがない場合は、コントロールを追加します。
上部メニューの「ツール」→「ツールボックスアイテムの選択」をクリックします。
「ツールボックスアイテムの選択」ウィドンウの「.NET Frameworkコンポーネント」タブから、C1TreeViewにチェックを入れて「OK」ボタンをクリックします。
C1TreeView項目は2つ表示される場合もありますが、名前空間が「C1.Win.TreeView」のものを選択します。
コントロールの配置
プロジェクトを作成すると、初期状態でForm1.csが中央のデザイナー画面に表示された状態で始まります。Form1.csが表示されていない場合は、Visual Studioの右ナビの「ソリューションエクスプローラー」ウィンドウの一覧から「Form1.cs」上で右クリック→「ビューデザイナー」をクリックします。
左側のツールボックスから「C1TreeView」をドラッグしてデザイナー画面にドロップします。
エディタからノードを追加する
C1TreeViewはエディタ画面からプログラムコード無しで、ツリービューの項目(ノード)を追加することができます。
ノードを追加するにはデザイナー画面の配置されたC1TreeViewコントロール上で右クリック→「ノードの編集」をクリックします。
「ノードの編集」をクリックすると「ツリーノードエディター」ウィンドウが表示されます。
「ツリーノードエディター」ウィンドウの左下の「追加」ボタンをクリックするとノードが追加されます。
ノードを選択し、ウィンドウ左下の「子の追加」ボタンをクリックすると、選択したノードの子ノードが追加されます。
ウィンドウ右下の「OK」ボタンを押して編集を終了します。
プログラムからノードを追加する
ノードの追加はプログラムコードから行うこともできます。
デザイナー画面に追加したC1TreeViewは、デフォルトで「c1TreeView1」という値がNameプロパティに指定されています(複数配置した場合などは末尾の数字が異なります)。Windows Formsの標準のコントロール同様、プログラム側でNameプロパティの値を用いてコントロールにアクセスできます。
まず、先にプログラムからノードを追加した結果を見ておきましょう。
下の画像のように、ツリーノードエディターであらかじめ追加してあった「親ノード」というノードの他に「親ノード2」というノードと、その下に子ノードが追加されています。
以下がツリービューにノードを追加するコードです。
C1TreeViewに「親ノード2」という名前のノードを追加し、その子ノードとして「子ノード3」というノードを追加しています。
private void Form1_Load(object sender, EventArgs e)
{
// using句に「using C1.Win.TreeView;」を追加
C1TreeNode node1 = new C1TreeNode();
node1.SetValue("親ノード2");
// ツリービューにノードを追加する
c1TreeView1.Nodes.Add(node1);
// 子ノードを追加する
C1TreeNode node2 = new C1TreeNode();
node2.SetValue("子ノード3");
node1.Nodes.Add(node2);
}
アプリケーションを実行すると、以下のようにノードが追加されていることを確認できます。
TreeView for WinFormsの特徴[1]
チェックボックスの表示
C1TreeViewのCheckBoxesプロパティをtrueにすることで、項目にチェックボックスを表示することができます。
// チェックボックスを表示 c1TreeView1.CheckBoxes = true;
ノードの選択
チェックボックスを使わない場合でも、ノードの選択は可能です。その場合、SelectionModeプロパティで複数選択を許可などの設定を行うことができます。
// ノードの選択設定 c1TreeView1.SelectionMode = C1TreeViewSelectionMode.Multi;
SelectionModeは、C1TreeViewSelectionMode列挙体の値を指定します。C1TreeViewSelectionMode列挙体は、以下の値を取ります。
| Multi | すべてのノードから複数のノードを選択できます |
|---|---|
| MultiSibling | 1つの親ノード以下から複数選択できます |
| None | ノードを選択できません |
| Single | 1 つのノードを選択できます |
ノードの編集
ノードのテキストを編集可能にすることができます。編集を可能にするにはAllowEditingプロパティをtrueに設定します。
// ノードの編集 c1TreeView1.AllowEditing = true;
TreeView for WinFormsの特徴[2]
列ヘッダーの非表示
列ヘッダーの表示・非表示を切り替えることができます。
列ヘッダーの表示・非表示を切り替えるにはShowColumnHeadersプロパティにtrue(表示)またはfalse(非表示)を指定します。
ノードのドラッグ&ドロップ
各ノードのドラッグ&ドロップもプロパティの変更で実現できます。
C1TreeViewのAllowDropとEnableDragDropをtrueに設定します。
データ連結
配列やコレクションデータを利用して、ノードを生成することができます。
例えば、以下のような学校のクラスを表すクラスがあったとします。
public class Class
{
// クラス名
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
}
1組、2組といったクラスをコレクションで表現し、C1TreeViewにデータ連結します。
List<Class> classList = new List<Class>();
classList.Add(new Class() { name = "1組"});
classList.Add(new Class() { name = "2組" });
classList.Add(new Class() { name = "3組" });
// データソースとしてclassListを指定する
c1TreeView1.DataSource = classList;
// フィールド名にnameプロパティを使用する
c1TreeView1.Columns[0].DisplayFieldName = "name";
プログラムを実行すると以下のようにノードが表示されます。
階層化データの連結
先ほどのクラス名を表示したノードの下に、生徒名を表示させる階層構造を持ったデータを連結することもできます。
クラスと生徒は以下のように定義されています。
public class Class
{
// クラス名
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
private BindingList<Student> _studentList;
public BindingList<Student> studentList
{
get { return _studentList; }
set { _studentList = value; }
}
}
public class Student
{
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
public override string ToString()
{
return name;
}
}
C1TreeViewに連結するコードは以下です。
List<Class> classList = new List<Class>();
// クラスとクラスに所属する生徒のコレクションを作成する
Class class1 = new Class() { name = "1組" };
class1.studentList = new BindingList<Student>();
class1.studentList.Add(new Student() { name = "山田" });
class1.studentList.Add(new Student() { name = "田中" });
classList.Add(class1);
Class class2 = new Class() { name = "2組" };
class2.studentList = new BindingList<Student>();
class2.studentList.Add(new Student() { name = "西村" });
classList.Add(class2);
classList.Add(new Class() { name = "3組" });
// データソースとしてclassListを指定する
c1TreeView1.DataSource = classList;
// フィールド名にnameプロパティを使用する
c1TreeView1.Columns[0].DisplayFieldName = "name";
// データメンバーにstudentListを指定
c1TreeView1.DataMember = "\\studentList";
TreeView for WinFormsの特徴[3]
列を持ったツリービュー表示
C1TreeViewでは、項目ごとに複数の列を持つことができます。
2列目に各クラスの生徒数を表示する列を追加します。
以下のように総生徒数を返すcountプロパティを追加します。
public class Class
{
// クラス名
private string _name;
public string name
{
get { return _name; }
set { _name = value; }
}
private BindingList<Student> _studentList = new BindingList<Student>();
public BindingList<Student> studentList
{
get { return _studentList; }
set { _studentList = value; }
}
// 総生徒数を返す
public int count
{
get{ return studentList.Count; }
}
}
列(column)を追加し、追加した列に総生徒数を表示するように指定します。
// 列の指定を一旦クリアクリア c1TreeView1.Columns.Clear(); C1TreeColumn clumn1 = new C1TreeColumn(); clumn1.HeaderText = "クラス"; c1TreeView1.Columns.Add(clumn1); C1TreeColumn clumn2 = new C1TreeColumn(); clumn2.HeaderText = "総生徒数"; clumn2.DisplayFieldName = "count\\count"; c1TreeView1.Columns.Add(clumn2);
カスタムノード
カスタムノードの機能を利用すると、ノードの表示をカスタマイズすることができます。
カスタムノードの設定は、CustomContentPresenterを継承したクラスで表示内容を定義します。
CustomContentPresenterを継承したクラスは、以下のメソッドをオーバーライドすることで固有の表示を定義します。
| ToolTipText | ツールチップの表示を指定します |
|---|---|
| SetStyle | スタイルを定義します |
| SetValue | 各ノード毎のデータを指定します |
| SetFormat | フォーマットを指定します |
CustomContentPresenterを継承した、以下のようなクラスを用意します。
public class SampleCustomNode : CustomContentPresenter
{
// 階層1
private TextElement _text1;
private ImageElement _img1;
private RowPanel _rowPanel;
// 階層2
private TextBoxElement _text2;
public SampleCustomNode()
{
// 階層1の初期化
_text1 = new TextElement();
_text1.Style = new Style();
_img1 = new ImageElement();
_img1.Style = new Style();
_img1.Size = new Size(45, 45);
_rowPanel = new RowPanel();
_rowPanel.Children.Add(_text1);
_rowPanel.Children.Add(_img1);
_rowPanel.Style = new Style();
_rowPanel.Style.VerticalAlignment = Alignment.Center;
// 階層2の初期化初期化
_text2 = new TextBoxElement();
_text2.Style = new Style();
}
public override string ToolTipText
{
get
{
return this.ToString();
}
}
public override void SetStyle(TreeNodeCellStyles styles)
{
// 階層1
_text1.Style.Margins = new Thickness(1);
_text1.Style.Font = new Font("Calibri", 10, FontStyle.Bold);
_img1.Style.ImageScaling = ImageScaling.Scale;
_img1.Style.ImageAlignment = ImageAlignment.CenterCenter;
// 階層2
_text2.Style.Font = new Font("Calibri", 10, FontStyle.Bold);
_text2.Style.HorizontalAlignment = Alignment.Center;
_text2.Style.VerticalAlignment = Alignment.Center;
}
// 各ノードに利用するデータを設定する
// 引数のobjectは表示に利用するデータが渡される。
public override void SetValue(object value)
{
// 階層1なら
if (Node.Level == 0)
{
_text1.Text = (string)value;
_img1.Image = Image.FromFile("logo.png");
Child = _rowPanel;
}
// 階層2なら
else
{
_text2.Text = (string)value;
Child = _text2;
}
}
public override void SetFormat(string str)
{
}
}
上記のSampleCustomNodeクラスを1列目の見た目に設定します。
c1TreeView1.Columns[0].CustomContentPresenter = new SampleCustomNode();
まとめ
TreeView for WinFormsはツリービューに必要な基本的な機能に加えて、ツリービューの表示に複数列を用いることができ、それぞれの列の表示を柔軟にカスタマイズできます。
高機能なツリービューを自社で開発するのは大変です。本記事で紹介したTreeView for WinFormsを利用し、開発コスト・開発期間の短縮に活かしてみてください。

