.NET 6および8でのWindows Formsデザイナへの対応については、以下の記事で紹介したように、一部動作しない機能が存在していましたが、現在は開発が進みほとんどの機能が動作するようになっています。
しかし、「MultiRow(マルチロウ)」のテンプレートデザイナについては未だに.NET 6および8では動作しません。そこで本記事では、.NET 8の環境においてMultiRowのテンプレートデザイナを利用する方法について確認します。
.NET 8で新規プロジェクト作成、パッケージ追加
.NET 8でWindows Formsプロジェクトを作成し、MultiRow for WindowsForms 12.0JのNuGetパッケージをインストールします。
ここで一度、テンプレートデザイナで発生する問題を確認します。フォームにMultiRowのコントロール「GcMultiRow」を配置して、コントロールのスマートタグからテンプレートの追加を試みてもできない状態になっています。
対処方法
この問題の対処方法としては、.NET Frameworkのプロジェクトではテンプレートデザイナが利用できるので、こちらのテンプレートデザイナを用いてテンプレートを作成し、完成したテンプレートを .NETのプロジェクトで読み込むという方法になります。
先ほど作成した .NETプロジェクトに対して .NET Frameworkのプロジェクトを追加します。
.NET Frameworkのプロジェクトでは、フォームにMultiRowのコントロール「GcMultiRow」を配置した場合、コントロールのスマートタグが正しく表示されることを確認できます。
.NET Frameworkのプロジェクトでテンプレートを作成
それでは、.NET Frameworkのプロジェクトでテンプレートを作成します。ソリューションエクスプローラーからプロジェクトを右クリックして[追加]-[新しい項目]を選択し、「MultiRow 12.0 テンプレート」を選択します。
テンプレートが作成され、テンプレートデザイナも問題なく表示されます。今回は、InputManCellやPlusPakCellを含む、MultiRowで配置できるコントロールを一通り配置してみます。
.NETのプロジェクトでテンプレートを読み込む
次に、作成したテンプレートを .NETのプロジェクトにて読み込みます。ソリューションエクスプローラーからプロジェクトを右クリックして、[追加]-[既存の項目]を選択して作成したテンプレートを追加します。追加する際に「リンクとして追加」を選択します。
.NETのプロジェクトにリンクファイルとしてテンプレートが追加されます。実際に開くのは .NET Framework側のテンプレートデザイナですが、こちらでテンプレートを確認できるようになります。
テンプレートの変換作業
テンプレートについては一部変換の作業が必要です。PlusPakCellを利用している場合、テンプレートの.resxファイル内にPlusPakのアセンブリ情報が生成されます。PlusPakは、.NETと .NET Frameworkで利用するアセンブリの名前が異なるので、プロジェクトのアセンブリ読み込みの際にGrapeCity.Win.PlusPak.NET.v120.dllをロードするように修正します。
internal static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// 追加処理
AppDomain.CurrentDomain.AssemblyResolve += (s, a) =>
{
var frameworkPPKAssemblyName = "GrapeCity.Win.PlusPak.v120";
var netPPKAssemblyName = "GrapeCity.Win.PlusPak.NET.v120";
if (a.Name.Contains(frameworkPPKAssemblyName))
{
return Assembly.Load(a.Name.Replace(frameworkPPKAssemblyName, netPPKAssemblyName));
}
return null;
};
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
ApplicationConfiguration.Initialize();
Application.Run(new Form1());
}
}
動作確認
それでは動作を確認します。フォームに配置したGcMultiRowのテンプレートとして、用意したTestTemplate
を設定し実行します。
using TemplateProject;
namespace MultiRow_Winforms_Sample;
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.gcMultiRow1.Template = new TestTemplate();
}
}
実行すると、テンプレートがリンクファイルでも問題なく動作することを確認できます。
さいごに
今回は .NET 8でMultiRowのテンプレートデザイナを使う方法を確認しました。.NET Frameworkで開発する場合と比べると、テンプレート用のプロジェクト作成やリンクファイルの追加、アセンブリ情報の書き換え、と実装に必要な作業が増えてしまっている状況です。
.NET環境におけるMultiRowのテンプレートデザイナについては、いくつか課題が残っており現時点では提供には至っていません。今後なるべく早期の提供を目指して優先的に取り組んでいきます。