form_loadイベントの直前または直後にコンポーネントコードを実行します。
-
20-09-2019 - |
質問
いくつかの内部翻訳を処理する別のコンポーネントと競合するコンポーネントがあります。
何が起こるかは、ビジネスロジックコンポーネントが実行され、翻訳システムが実行され、フォームに存在するテキストを選択し、それらを翻訳しようとすることです。
問題は、テキストに数字、日付、データベース関連のテキストなどが含まれていることです。しかし、ビジネスロジックが実行される前に、それらのコントロールは空白または翻訳用に準備されたダミーテキストが含まれていました。
フォームでドロップするコンポーネントをどのようにして、フォームの生涯の特定の時間にコードを実行するコンポーネントを作成できるのだろうかと思っています。
たとえば、ビジネスロジックコンポーネントから問題のあるコードを削除して、構築時に何もしないようにすると、翻訳作業が行われ、そのメソッドを呼び出した場合、そのコードをform_loadから動かした場合、それはうまく機能します。
だから私は疑問に思っています、私のために、コンポーネントから(つまり、下降した方法がありますか 成分, 、視覚的なコントロールではありません)、form_loadの直前または直後にコードを実行するか、少なくとも他のすべてのコンポーネントとコントロールがセットアップされた後にコードを実行しますか?
コンポーネント内からフォームに戻るリンクではないようであるため、ロードイベントに接続することも不可能に思えます。
それとも私は間違った木をbarえていますか?
解決
フォームのロードイベントハンドラーからコンポーネントのメソッドを明示的に呼び出すことで、なぜこれを解決できなかったのかは明らかではありません。
コンポーネントを削除するフォームを認識させることが可能です。デザイナーは、コンポーネントのプロパティをフォームインスタンスに初期化するためにcoAxedすることができます。これは、ErrorProviderが使用する手法であり、たとえば、フォームにエラーアイコンをペイントします。これを拡張して、コンポーネントがフォームのロードイベントを購読できるようにすることができます。これが例です:
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Windows.Forms;
namespace WindowsFormsApplication1 {
public partial class Component1 : Component {
public Component1() {
InitializeComponent();
}
public Component1(IContainer container) {
container.Add(this);
InitializeComponent();
}
[Browsable(false)]
public ContainerControl Host {
get { return mHost; }
set {
if (mHost == null && value as Form != null && !DesignMode) {
(value as Form).Load += Initialize;
}
mHost = value;
}
}
private ContainerControl mHost;
public override ISite Site {
set {
base.Site = value;
if (value != null) {
// Assign Host at design time
IDesignerHost service = value.GetService(typeof(IDesignerHost)) as IDesignerHost;
if (service != null) {
IComponent rootComponent = service.RootComponent;
this.Host = rootComponent as ContainerControl;
}
}
}
}
private void Initialize(object sender, EventArgs e) {
Console.WriteLine("initializing...");
}
}
}