form_loadイベントの直前または直後にコンポーネントコードを実行します。

StackOverflow https://stackoverflow.com/questions/2265776

  •  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...");
    }
  }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top