GanttView for WinForms(以降、C1GanttView)は、Microsoft Project のルック&フィールを備えたガントチャートコントロールです。主要なデータストレージや各種 UI 要素があらかじめ定義されており、ほとんどコーディングすることなく、本格的なプロジェクト管理アプリケーションを実現できるとあって、多くのお客様に支持いただいております。現在では WPF 版も提供されておりますので、ますます活用の場が広がるものと思います。
その C1GanttView に対して多く寄せられるのが、「タスクの編集ダイアログをカスタマイズしたい」といったご要望です。C1GanttView には組み込みの「タスク情報」ダイアログが用意されており、タスクの編集時には既定でこのダイアログが使用されるので、タスク情報の編集処理に関わるコーディングの手間が大幅に削減できる一方で、ダイアログの外観や編集可能な項目はご自身で細かくカスタマイズしたい、といったご要望も少なくありません。そこで、今回はタスク情報ダイアログのカスタマイズ方法についてご紹介いたします。
ダイアログのカスタマイズ方法
タスク情報ダイアログをカスタマイズする方法として、大きく2通りが考えられます。
- 独自に用意したダイアログを使用する
- 組み込みのダイアログの UI を一部変更する
このうち、1.については、製品に付属の「CustomTaskInfoDialog」サンプルにてその実装方法を説明しておりますので、詳しくはそちらをご参照ください。
2.については、組み込みのタスク情報ダイアログ(TaskForm クラス)自身が元々ユーザーによるカスタマイズを想定していないこともあり、そのすべての要素を自由にカスタマイズするための機能は用意されておりません。ただし、インスタンスの内部要素に直接アクセスすることで、一部の要素を無効化・非表示化する程度であれば、容易に実現できます。
以下は、組み込みのタスク情報ダイアログ内にある「サマリーバーに反映」「グループバーに反映」の各チェックボックスを無効化する例を示します。
[C#]
private void c1GanttView1_ShowDialog(object sender, ShowDialogEventArgs e) { if (e.DialogType == DialogType.TaskInfo) { var chks = e.Dialog.Controls.OfType<CheckBox>().Where(x => x.Text.Contains("反映")); foreach (var chk in chks) chk.Enabled = false; } }
[VB]
Private Sub C1GanttView1_ShowDialog(sender As Object, e As ShowDialogEventArgs) Handles C1GanttView1.ShowDialog If e.DialogType = DialogType.TaskInfo Then Dim chks = e.Dialog.Controls.OfType(Of CheckBox)().Where(Function(x) x.Text.Contains("反映")) For Each chk As CheckBox In chks chk.Enabled = False Next End If End Sub
このコードでは、主に以下の処理を行っています
- 表示されるダイアログが「タスク情報」ダイアログかどうかを確認します
ShowDialog
イベントは、タスク情報ダイアログのほか、「リンク情報」ダイアログが表示されるときにも発生することにご注意ください
e.Dialog
イベント引数を参照し、既定のタスク情報ダイアログのインスタンスにアクセスします- その
Control
プロパティを介して、テキスト内に「反映」が含まれる CheckBox コントロールを列挙します- これにより、サマリーバーに反映」「グループバーに反映」の各チェックボックスが抽出されます
- それらコントロールの
Enabled
プロパティを False に設定します
e.Dialog
イベント引数は、独自に用意したダイアログのインスタンスを渡すだけでなく、既定のダイアログのインスタンスを参照する場合にも使用できます。これを利用することで、今回の例のようにフォームの内部要素に直接アクセスして、その設定内容を変更することができます。
ただし、これらの内部要素はユーザーによって UI の動作が制御されることを前提としていないこともあり、不用意にそれらの設定を変更すると予期しない動作を引き起こす要因となることがあります。そのため、適用にあたっては十分に動作確認を行うことをお勧めします。
なお、今回ご紹介しました方法は、C1GanttView の WinForms 版のみ適用可能である点にご注意ください。WPF 版にも同様に ShowDialog
イベントが用意されておりますが、こちらではダイアログの表示キャンセルのみ実行可能となっております。