La conversione è semplice e potrebbe persino essere completamente automatizzata. Richiede semplicemente cambiando alcune impostazioni e le classi di base nel progetto DLL si desidera che i controlli incorporati in ASCX.
1 ... Per ogni UserControl, impostare Operazione di generazione del file ASCX (sotto Proprietà) per "Risorsa incorporata "ed elimina il suo file designer associato.
2 ... Salvare il progetto.
3 ... Fare clic con il pulsante destro del mouse sul progetto e selezionare "Scarica progetto".
4 ... Fare nuovamente clic con il pulsante destro del mouse e selezionare l'opzione "Modifica * .csproj".
Modifica sezioni che assomigliano a questo (dove l'asterisco rappresenta il nome della classe):
<Compile Include="*.ascx.cs">
<DependentUpon>*.ascx</DependentUpon>
<SubType>ASPXCodeBehind</SubType>
</Compile>
a guardare come questo
<Compile Include="*.ascx.cs" />
che farà sì che i file code-behind per essere compilato in modo indipendente dei file ASCX.
5 ... Salvare le modifiche e fare clic con il pulsante destro del mouse sul progetto e selezionare "Ricarica progetto".
6 ... aperte tutti i tuoi "*" .ascx.cs file e renderli ereditano dalla seguente classe UserControl personalizzato, anziché la classe System.Web.UI.UserControl (potrebbe essere necessario individuare genitore classi per completare questo passaggio).
public class UserControl : System.Web.UI.UserControl
{
protected override void FrameworkInitialize()
{
base.FrameworkInitialize();
string content = String.Empty;
Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType().FullName + ".ascx");
using (StreamReader reader = new StreamReader(stream))
content = reader.ReadToEnd();
Control userControl = Page.ParseControl(content);
this.Controls.Add(userControl);
}
}
Questa classe di base si occuperà del caricamento e dell'analisi del file ASCX incorporato.
7 ... Infine, potrebbe essere necessario inserire i file ASCX in sottocartelle in modo che i loro nomi delle risorse (determinato automaticamente dal percorso della cartella) corrispondono al nome di tipo completo della loro classe associata (plus "ascx"). Supponendo che lo spazio dei nomi di root corrisponda al nome del progetto, una classe denominata "ProjectName.Namespace1.Namespace2.ClassName" avrà bisogno del suo file ASCX in una sottocartella "Namespace1 \ Namespace2", quindi verrà incorporata con il nome "ProjectName.Namespace1.Namespace2. ClassName.ascx".
E questo è tutto! Una volta compilata la DLL e inserita in un altro progetto, è possibile creare un'istanza delle istanze dei controlli utente utilizzando l'operatore "nuovo", come qualsiasi altra classe. Come sempre, il tuo controllo verrà "catturato" all'evento di pagina corrente una volta aggiunto come controllo figlio alla pagina o ad un altro controllo sulla pagina.
Avete analizzato la soluzione che ho incollato? Funziona molto bene per la creazione di una libreria di controllo utente. Eviterei la creazione della libreria di controllo utente, se possibile, come diciamo altri, ma se non hai nessuna opzione, guarda l'articolo –