Asp.net Usercontrol LoadControl Problème
Je rencontre un problème lors de l'utilisation de LoadControl( type, Params )
. Laissez-moi vous expliquer...
J'ai une super simple de contrôle de l'utilisateur (ascx)
<%@ Control Language="C#" AutoEventWireup="True" Inherits="ErrorDisplay" Codebehind="ErrorDisplay.ascx.cs" EnableViewState="false" %>
<asp:Label runat="server" ID="lblTitle" />
<asp:Label runat="server" ID="lblDescription" />
avec le code ( c# ) derrière:
public partial class ErrorDisplay : System.Web.UI.UserControl
{
private Message _ErrorMessage;
public ErrorDisplay()
{
}
public ErrorDisplay(Message ErrorMessage)
{
_ErrorMessage = ErrorMessage;
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
if (_ErrorMessage != null)
{
lblTitle.Text = _ErrorMessage.Message;
lblDescription.Text = _ErrorMessage.Description;
}
}
}
Ailleurs dans mon application web, je suis l'ajout d'une instance de l'objet usercontrol à la page en utilisant le code suivant:
divValidationIssues.Controls.Add(LoadControl(typeof(ErrorDisplay), new object[] { MessageDetails }));
Je suis l'aide de la version surchargée de LoadControl parce que je veux passer le Message en paramètre du constructeur. Tout cela apparaît de travailler sur ok.
Toutefois, lorsque le OnPreRender()
est tiré sur le ErrorDisplay usercontrol la lblTitle et lblDescription variables sont à la fois null
, bien qu'ils aient une majoration équivalente. La variable message a été correctement remplie.
Quelqu'un peut nous donner un indice sur le pourquoi de ce qui pourrait se passer?
Grâce
EDIT:
Juste pour plus de clarté je vais aussi ajouter que le code qui est en programmant l'ajout de l'objet usercontrol à la page est en cours d'exécution en réponse à la pression d'un bouton, de sorte que le "hébergement de la page" a progressé grâce à l'Init, Page_Load et est maintenant le traitement de l'gestionnaires d'événements.
Je ne peux pas ajouter les usercontrols plus tôt asp étape du cycle de vie, car ils sont créés en réponse à un événement de clic de bouton.
OriginalL'auteur Ash | 2008-10-27
Vous devez vous connecter pour publier un commentaire.
J'ai essayé le code suivant - ce qui donne le même résultat (c'est à dire à la fois lblTitle et lblDescription sont nuls)
J'avais entendu que le LoadControl fonction apporté le contrôle du chargement jusqu'à l'actuel état de la page sur laquelle il est inclus. d'où l'Init, Page_Load etc sont tous exécutés dans le cadre de la LoadControl appel.
Il est intéressant de cette (sans réponse) asp.net les forums présente le même problème que je rencontre.
Les Forums MSDN Post
De plus - à Partir de MSDN:
Ne devraient donc pas LoadControl correctement initalise le contrôle?
EDIT:
Ok, donc je vais répondre à ma propre question ici ..
J'ai trouvé une a répondu version du post sur le forum j'ai lié ci-dessus Ici
Essentiellement la réponse est que la
LoadControl( type, params )
ne peut pas déduire la page 'en face' ascx à analyser et donc ça ne dérange pas initalising les contrôles. Lorsque vous utilisez leLoadControl( "ascx path" )
version, elle est donnée à la page d'en face, et donc ne l'analyse et initalision.Donc en résumé j'ai besoin de changer le code qui est initalising le contrôle et de le diviser en parties distinctes. I. e.
Et cela devrait fonctionner ok.. Il n'est pas aussi soigné que ma tentative précédente, mais au moins il fonctionne.
Je suis toujours ouvert aux suggestions pour améliorer la ci-dessus.
Acclamations
Excellent suivi!
OriginalL'auteur Ash
D'accord avec Mitchel, vous devriez être en mesure de mettre un page_load dans le code de contrôle lui-même qui aurait le feu après les contrôles sont complètement disponibles.
OriginalL'auteur thismat
Eh bien, il est toujours à l'ajout de votre propre charge de l'événement et de l'appeler après avoir couru le constructeur et a ajouté que le contrôle de la page, mais ce n'est pas beaucoup différent de ce que vous avez, bien que je pourrais choisir pour style raisons.
Heureux que vous avez trouvé une réponse à votre question!
OriginalL'auteur thismat
Ici est un blog écrit par Steven Robbins. Le post qui explique comment passer des paramètres pour un contrôle utilisateur à l'aide de
LoadControl
, semblable à ce queLoadControl(Type, object[])
, sauf qu'il fonctionne 🙂OriginalL'auteur bflemi3
J'ai eu un problème similaire avec le contrôle de Calendrier DayRender événement, que j'ai voulu ajouter un contrôle utilisateur à l'e.Cellule.Collection de contrôles. Après avoir essayé un couple de l'échec des approches de contrôle de l'utilisateur page_load pas de tir ou la zone de liste sur le ascx lancer une exception nulle, j'ai trouvé que si je l'ai initialisé mon contrôle sur le formulaire avec LoadControl(ascx) et ensuite commencer à accéder au balisage des contrôles sur le ascx, tout a bien fonctionné. Cette approche ne dépend pas de l'événement Page_Load de la ascx.
ASCX balisage
code derrière
Public Class CPCalendarCell
Hérite Du Système.Web.L'INTERFACE utilisateur.UserControl
Fin De La Classe
page ASPX balisage
code derrière Calendrier DayRender événement sur le formulaire
OriginalL'auteur WebKing
Par l'asp.net page cycle de vie de vos contrôles ne sont pas pleinement ajouté en pré-rendu, pourquoi ne pas vous venez de charger les valeurs dans le page_load?
Raised after the Page object has created all controls
OriginalL'auteur Mitchel Sellers