2009-07-30 8 views
1

Disons que j'ai un objetConfus au sujet databinding dans ASP.NET

class Person { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Et cet objet est récupéré à partir d'une usine (c.-à-Ne peut pas utiliser SQLDataSource ou quelque chose comme ça)

Person person = PersonFactory.GetPerson(); 

Comment puis-je bidimensionnel DataBind les deux propriétés à Textboxes sur un formulaire Web? J'ai regardé dans FormView, mais cela ne semble pas correspondre à mes besoins car je ne suis pas en train d'itérer sur une collection d'objets. Et quand j'ai essayé de l'utiliser, je ne semble pas obtenir les valeurs affichées dans l'objet Personne dans l'événement FormUpdated. Et je suis comme ça lient

Markup

<asp:Textbox Text=<%# Bind("Name") %> /> 

code derrière

FormView1.DataSource = new List() { person }; 
FormView1.DataBind(); 

Je me sens comme je manque quelque chose de vraiment évident. Devrais-je utiliser un FormView? Cela ne semble pas approprié pour une simple liaison de données, mais la méthode < #% Bind%> doit être dans un type de conteneur - y a-t-il un objet plus approprié?

+0

J'utilise un panneau de mise à jour si cela fait une différence – Bob

Répondre

1

Vous devez gérer les mises à jour de votre FormView - les mises à jour dans les contrôles de la base de données asp.net ne sont pas automatiques. J'envisagerais également d'utiliser un ObjectDataSource - garder votre lien tout dans le balisage peut rendre les choses plus faciles à trouver. Lorsque vous utilisez le ObjectDataSource - il va automatiquement envelopper votre objet unique dans un IEnumerable, de sorte que la liaison à une méthode qui renvoie une personne est acceptable. Vous pouvez également envisager d'utiliser un DetailsView si vous ne voulez pas écrire le formulaire vous-même. Dans votre cas, vous pourriez faire la

suivante
<asp:FormView runat="server" DataSourceID="MyPersonDataSource"> ... </asp:FormView> 
<asp:ObjectDataSource runat="server" ID="MyPersonDataSource" 
    TypeName="PersonFactory" DataObjectTypeName="Person" 
    SelectMethod="GetPerson" UpdateMethod="UpdatePerson" /> 

Et pour faciliter cela, vous auriez besoin d'une méthode UpdateMethod (personne) de votre classe PersonFactory. Le faire de cette façon élimine votre liaison du codebehind et permettra à vos mises à jour de votre objet personnel d'être conservées dans votre magasin de données sans que vous ayez à gérer vous-même les événements de mise à jour.

+0

Merci pour l'aide, est-il possible d'éviter l'utilisation de la source de données d'objet? – Bob

+0

Bien sûr, vous devrez cependant gérer manuellement l'événement ItemUpdated de FormView. ODS enveloppe tout ça bien pour vous. –

+0

Merde, Mon usine provient d'une classe proxy de printemps, j'ai du mal à obtenir le ObjectDataSource à – Bob

1

Essayez d'appeler la méthode DataBind sur vos contrôles TextBox.

protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 

    MyTextBox1.DataBind(); 
    MyTextBox2.DataBind(); 
} 

Je ne l'ai jamais essayé de faire les deux sens contraignant exactement de cette façon avant, mais en utilisant le Bind (« propriété ») syntaxe, il devrait fonctionner de cette façon pour autant que je sache.

Si l'appel de la méthode DataBind ne fonctionne pas, alors FormView est votre meilleur choix.

+0

Les zones de texte doivent être dans un conteneur pour utiliser la liaison. J'utilise le FormView en ce moment, mais je n'arrive pas à faire refléter mes valeurs affichées dans mon objet. – Bob

+0

Je suppose que cela devrait être dans un conteneur. Comment vérifiez-vous les valeurs sur la publication? Maintenant que j'y pense un peu plus, je pense que vous devez utiliser une source de données d'une certaine sorte, car c'est aussi ce qui va passer les modifications. –

+0

Je mets la source de données dans le code derrière, je mettrai à jour mon post. – Bob

-1
DataBinder.Eval(Container.DataItem, "Name") 

Ceci devrait faire l'affaire, mais je pense que vous avez besoin de votre propre gestion d'événements pour effectuer la liaison bidirectionnelle.

Questions connexes