少し前に、カスタム ベース フォームとコントロールの実装を作成し、1 つのプロパティを追加して OnLoad メソッドをオーバーライドするソリューションを実装しました。
public partial class FormBase : Form
{
public FormBase ()
{
this.InitializeComponent();
}
protected ConsistencyManager ConsistencyManager { get; private set; }
protected override void OnLoad(System.EventArgs e)
{
base.OnLoad(e);
if (this.ConsistencyManager == null)
{
this.ConsistencyManager = new ConsistencyManager(this);
this.ConsistencyManager.MakeConsistent();
}
}
}
ConsistencyManager クラスは、すべてのコントロール、コンポーネントを検索し、特定のコントロール内のカスタム子コントロールの検索もサポートします。MakeConsistent メソッドからのコードのコピー/貼り付け:
public void MakeConsistent()
{
if (this.components == null)
{
List<IComponent> additionalComponents = new List<IComponent>();
// get all controls, including the current one
this.components =
this.GetAllControls(this.parentControl)
.Concat(GetAllComponents(this.parentControl))
.Concat(new Control[] { this.parentControl });
// now find additional components, which are not present neither in Controls collection nor in components
foreach (var component in this.components)
{
IAdditionalComponentsProvider provider = GetAdditinalComponentsProvider(component.GetType().FullName);
if (provider != null)
{
additionalComponents.AddRange(provider.GetChildComponents(component));
}
}
if (additionalComponents.Count > 0)
{
this.components = this.components.Concat(additionalComponents);
}
}
this.MakeConsistent(this.components);
}
完全なサンプルまたはソースが必要な場合は、お知らせください。
よろしく、 ズヴォンコ
PS: 同様に、メイン スレッドでの呼び出し回数をカウントするパフォーマンス カウンターも作成しました。