2010-09-21 4 views
0

J'ai une propriété personnalisée sur un contrôle utilisateur qui a plusieurs états/modes. Si cette propriété est définie dans la page parente: Je voudrais que mon contrôle se mette à jour automatiquement. L'utilisation de la propriété dans le chargement de la page ne fonctionne pas car elle n'est pas lancée.Overriding DataBind sur le contrôle de l'utilisateur, mises en garde?

Je peux imaginer 3 méthodes pour ce faire:

  1. Sur la propriété, je pourrais ajouter un bloc de code qui appellerait this.DataBind().
  2. Je pourrais ajouter le code en remplaçant la méthode virtuelle DataBind.
  3. Je pourrais créer une méthode de mise à jour propriétaire publique.

Je voudrais avoir une idée de ce qu'est la meilleure pratique en général. Plus précisément, j'ai choisi de remplacer la méthode virtuelle DataBind. Mon pseudo code est en tant que tel:

public override void DataBind() 
{ 
     if (SpecialMode) 
     { 
     .. load from database 

     } 
     base.DataBind() 
    } 

Je suis intéressé par l'ordre des base.DataBind(). Je l'ai vu généralement placé en premier, mais après que je charge les données de la base de données: je vais avoir besoin de databind pour obtenir les données à afficher.

Toute contribution à ces considérations sera grandement appréciée.

Pour être clair:

Ce contrôle est un widget sondage. Il recherche généralement et charge le sondage à afficher à partir de l'événement Page_Load. Mais, il a aussi un mode rapports qui permet à la page dans laquelle le contrôle est incorporé de changer l'identifiant du sondage à afficher. Cette propriété ne sera pas initiée dans Page_Load. Ok, une partie de ce bordel est que j'ai une propriété pour un objet, et j'ai aussi une propriété dupliquée pour ViewState mais seulement l'Id.

Répondre

0

Votre contrôle utilisateur peut gérer la liaison de données automatique dans son événement PreRender. Lorsque la propriété Id est modifiée (ou quelle que soit la propriété qui déclenche la liaison de données automatique), vous pouvez définir un indicateur dans le contrôle qui sera vérifié plus tard dans PreRender pour indiquer que les données doivent être chargées. Alternativement, au lieu de définir un indicateur, vous pouvez éventuellement effacer les données que vous avez déjà chargées depuis ViewState et implémenter une logique dans PreRender pour dire "S'il n'y a pas de données, alors chargez-le".

Cela évite de charger des données plusieurs fois au sein d'une seule requête en raison de situations où il se trouve du code qui définit la propriété Id plusieurs fois.

+0

@DrWily Merci, cela a du sens. Je vais attendre pour voir si je reçois plus de suggestions.Une partie de la complexité vient du fait que je stocke des données d'état en utilisant ViewState mais seulement l'Id mais pour des raisons de commodité, je stocke également un objet dans la propriété, donc quand l'Id change l'autre propriété devrait changer. Mais la première fois, je charge réellement l'Id de l'objet complet. Donc, je ne veux pas vraiment charger l'objet complet sauf si nécessaire. Je vois maintenant que c'est un peu le bordel. –

0

Votre contrôle ne doit en aucun cas dépendre de la page sur laquelle il est intégré. Au lieu de cela, avoir une propriété "AutoUpdate" sur le contrôle, et avoir la page définie. La page doit également définir les propriétés indiquant au contrôle comment mettre à jour lorsque la propriété AutoUpdate est définie.

+0

@Saunders C'est ce que je fais. Je vais ajouter une précision. –

+0

@Curtis: tout d'abord, utilisez le début du nom d'utilisateur, comme "@John". Deuxièmement, votre contrôle ne doit pas charger les données tout seul. Regardez comment un contrôle DataGrid le fait. En outre, si vous ne liez pas à des données, n'utilisez pas la méthode DataBind. Remplacez simplement OnPreRender ou Render si la sortie du contrôle diffère en fonction de cette propriété. Si la _data_ diffère en fonction de la propriété, la page doit indiquer à nouveau quelles données utiliser, et non le contrôle. –