2009-06-10 6 views
1

J'utilise la fonctionnalité ASP.NET Dynamic Data pour faire quelque chose d'un peu bizarre. À savoir, créer une liste dynamique de champs en tant qu'enfants de l'objet principal.Comment obtenir la valeur d'un DynamicControl?

Donc, fondamentalement, j'ai Ticket.Fields. La page principale répertorie tous les champs de Ticket et la propriété Fields possède un contrôle DynamicControl qui génère une liste de contrôles pour collecter plus de données. La partie délicate est que cette liste utilise également des données dynamiques pour générer les contrôles, de sorte que chaque champ peut être l'un des FieldTemplates définis ... ce qui signifie que je ne sais pas nécessairement ce que le contrôle des données sera quand j'essayerai pour avoir la valeur. Alors, comment puis-je obtenir la valeur d'un DynamicControl? Dois-je créer une nouvelle sous-classe de FieldTemplate qui fournit un moyen d'obtenir la valeur?

Répondre

0

C'est incroyable ce qu'une bonne nuit de sommeil fera.

Eh bien, et va étendre FieldTemplate pour se rendre compte qu'il expose déjà le contrôle de données pour vous ...

foreach (ListViewDataItem i in lvFields.Items) 
    {   
     var val = i.FindDynamicControlRecursive("ValueText") as DynamicControl; 
     var ft = val.FindFieldTemplate("ValueText") as FieldTemplateUserControl; 

     ParseControl(ft.DataControl) 
    } 

ParseControl se compose ici, mais j'ai en fait une classe autour de la pose qui peut gérer cette partie pour moi ... alors j'espère que les futurs lecteurs auront au moins l'idée ici.

Le bit important consiste à convertir le résultat de FindFieldTemplate en FieldTemplateUserControl. Pour une raison quelconque, il retourne juste Control, même si il semble qu'il devrait seulement être en mesure de retourner FieldTemplateUserControls. Je suppose que vous pouvez remplacer les modèles de champs en modifiant la classe du générateur de champs ... mais toujours.