(1) Per controllare che il componente possa essere aggiunto a un modulo, utilizzare un costruttore FooComponent
che ha passato un modulo e non definire il costruttore predefinito. Si chiama come:
FooComponent component = new FooComponent(this);
dove il componente viene creato all'interno del modulo stesso. Non definendo il costruttore predefinito, questo:
FooComponent component = new FooComponent();
non verrà compilato.
(2) esporre una proprietà FooComponent
sul modulo stesso, e nel costruttore del FooComponent
, impostare il FooComponent
per this
form passata.
(3) Stessa cosa, nel costruttore per il FooComponent
, registrare con l'evento di chiusura per il modulo che avete passato
mettere tutto insieme e si ottiene:
public class MyForm : Form {
public FooComponent OwnedComponent { get; set; }
}
public class FooComponent {
public FooComponent (MyForm OwnerForm) {
OwnerForm.OwnedComponent = this;
OwnerForm.FormClosing += MyCallback;
}
private void MyCallback(object sender, FormClosingEventArgs e) {
...
}
}
MODIFICA
Sfortunatamente, se avete bisogno di e costruttore predefinito, e se deve essere un vero componente drop-on-the-form, non c'è modo di far rispettare che un componente viene creato solo su un modulo o che il modulo ha solo un'istanza del componente (non da all'interno del componente, comunque).
Il problema è duplice:
(1) Eliminazione di un componente non aggiungere il componente alla forma, si aggiunge alla collezione del modulo components
. Quindi, anche se potresti ottenere un handle per il genitore/proprietario, non sarà mai una forma.
(2) Come indicato da Neil, l'eliminazione di un componente in un modulo chiama il costruttore predefinito, che non passa alcun parametro e, ovviamente, nessuna delle proprietà del componente (come il sito o il contenitore) viene popolata.
Possibilmente utile: Un componente può essere progettato per essere avvisati quando viene creato in due modi:
(1) Implementando un costruttore che accetta un parametro IContainer
. Quando il componente viene rilasciato su un modulo, il codice generato chiamerà invece questo costruttore. Tuttavia, lo farà solo in fase di runtime, non in fase di progettazione. Ma il contenitore sarà un handle per la raccolta components
del modulo.
public FooComponent(IContainer container) {...}
(2) Implementando ISupportInitialize
. Quando il componente viene rilasciato su un modulo, il codice generato chiamerà inoltre BeginInit()
e EndInit()
. In EndInit()
, è possibile accedere a proprietà come Site
e Container
. Anche in questo caso, lo si otterrà solo in fase di runtime, non in fase di progettazione, e lanciando un'eccezione qui non impedirà la creazione del componente.
Vecchi, ma eccellenti articoli su componenti e controlli da MSDN Magazine di Michael Weinhardt e Chris Sells.
April 2003 Building Windows Forms Controls and Components with Rich Design-Time Features
May 2003 Building Windows Forms Controls and Components with Rich Design-Time Features, Part 2
Questi sono ora file di aiuto CHM. Dovrai sbloccare la pagina delle proprietà del file per abilitare la lettura dei contenuti dopo il download.
Penso che si possa guardare CodeDomSerializer (http://msdn.microsoft.com/en-us/library/system.componentmodel.design.serialization.codedomserializer.aspx). Potrebbe essere la soluzione migliore. – PHeiberg
@PHeiberg: Grazie –