Domanda

Ho un componente che è in conflitto con un altro componente che gestisce alcune traduzioni interne.

Succede che componenti di business logic Viene eseguito, allora il sistema di traduzione esegue, che raccoglie testi oggi presenti in forma, e tenta di tradurli.

Il problema è che il testo contiene ora le cose come numeri, date, testo relative al database, ecc, ma prima è stato eseguito la logica di business, i controlli era o vuoto o conteneva dummy-testo preparato per la traduzione.

Mi chiedo come posso avere un componente che mi cade su una forma eseguire il suo codice in un momento specifico nel corso della vita della forma.

Per esempio, se tolgo il codice incriminato dal componente logica di business, in modo che esso non fa nulla su di costruzione, quindi il lavoro di traduzione, e se quindi chiamare il metodo che ho spostato il codice a da Form_Load, anche questo funziona bene.

Quindi mi chiedo, c'è un modo per me, da un componente (es. Disceso da componente, non un controllo visivo), di eseguire codice appena prima o dopo Form_Load, o almeno dopo tutti gli altri componenti e controlli sono stati istituiti?

Non sembra essere alcun collegamento dall'interno del componente torna alla forma, quindi per me, per il collegamento nell'evento Load non sembra possibile sia.

O sono abbaiare contro l'albero sbagliato?

È stato utile?

Soluzione

Non mi è chiaro il motivo per cui non si poteva solo risolvere questo chiamando esplicitamente il metodo di un componente dal gestore di eventi Load del form.

Fare un componente a conoscenza del modulo su cui è caduto è possibile. Il progettista può essere blandito per inizializzare una proprietà del componente all'istanza modulo. Questa è una tecnica utilizzata da ErrorProvider per esempio, dipinge le icone di errore nel modulo. Questo potrebbe poi essere esteso a lasciare che il componente di iscriversi all'evento Load del form. Ecco un esempio:

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...");
    }
  }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top