Ejecutar el código de componente justo antes o después del evento Form_load en .NET WinForms?

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

  •  20-09-2019
  •  | 
  •  

Pregunta

Tengo un componente que está en conflicto con otro componente que maneja algunas traducciones internas.

Lo que sucede es que los componentes lógicos de negocios se ejecutan, luego el sistema de traducción se ejecuta, que recoge textos ahora presentes en el formulario e intenta traducirlos.

El problema es que el texto ahora contiene cosas como números, fechas, texto relacionado con la base de datos, etc. Pero antes de que se ejecutara la lógica comercial, esos controles estaban en blanco o contenían texto ficticio preparado para la traducción.

Me pregunto cómo puedo tener un componente que dejo en un formulario ejecutar su código en un momento específico en la vida útil del formulario.

Por ejemplo, si elimino el código ofensivo del componente de la lógica de negocios, para que no haga nada en la construcción, entonces el trabajo de traducción, y si llamo al método, moví ese código de Form_Load, eso también funciona bien.

Así que me pregunto, ¿hay alguna manera para mí, de un componente (es decir, descendido de Componente, no un control visual), para ejecutar el código justo antes o después de Form_load, o al menos después de que se hayan configurado todos los demás componentes y controles?

No parece ser ningún enlace desde dentro del componente hasta el formulario, por lo que para mí tampoco parece posible.

¿O estoy ladrando el árbol equivocado?

¿Fue útil?

Solución

No me queda claro por qué no podría resolver esto llamando explícitamente el método de un componente desde el controlador de eventos de carga del formulario.

Es posible hacer un componente consciente del formulario en el que se cae. El diseñador se puede coaxtar para inicializar una propiedad del componente a la instancia de formulario. Esta es una técnica utilizada por ErrorProvider, por ejemplo, pinta los iconos de error en el formulario. Esto podría extenderse para permitir que el componente se suscriba al evento de carga del formulario. Aquí hay un ejemplo:

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...");
    }
  }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top