1

一部の内部変換を処理する別のコンポーネントと競合するコンポーネントがあります。

何が起こるかというと、ビジネスロジックコンポーネントが実行され、次に翻訳システムが実行され、フォームに現在存在するテキストを取得して、それらを翻訳しようとします。

問題は、テキストに数字、日付、データベース関連のテキストなどが含まれているが、ビジネスロジックが実行される前は、これらのコントロールが空白であるか、翻訳用に準備されたダミーテキストが含まれていることです。

フォームにドロップしたコンポーネントに、フォームの存続期間中の特定の時間にそのコードを実行させるにはどうすればよいのでしょうか。

たとえば、問題のあるコードをビジネスロジックコンポーネントから削除して、構築時に何も実行しないようにすると、変換が機能し、そのコードをForm_Loadから移動したメソッドを呼び出すと、それもうまく機能します。

ですから、コンポーネントから(つまり、ビジュアルコントロールではなく、コンポーネントから派生した)、Form_Loadの直前または直後、または少なくとも他のすべてのコンポーネントとコントロールが設定された後にコードを実行する方法はありますか?上?

コンポーネント内からフォームに戻るリンクではないように見えるので、Loadイベントにフックすることもできないようです。

それとも私は間違った木を吠えていますか?

4

1 に答える 1

2

フォームの Load イベント ハンドラーからコンポーネントのメソッドを明示的に呼び出すことによって、これを解決できなかった理由は明らかではありません。

ドロップされたフォームをコンポーネントに認識させることが可能です。設計者は、コンポーネントのプロパティをフォーム インスタンスに初期化するように誘導できます。これは ErrorProvider で使用される手法です。たとえば、フォームにエラー アイコンを描画します。これを拡張して、コンポーネントがフォームの Load イベントをサブスクライブできるようにすることができます。次に例を示します。

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...");
    }
  }
}
于 2010-02-15T13:32:32.290 に答える