2009-10-21 8 views
3

J'ai un gridview, dont le contenu sont fournies par AccessDataSource les données affichées dépend dans une liste déroulante qui a un événement postback.net C# postback remplace zone de texte lié

  • La page se charge
  • utilisateur sélectionne un élément dans la liste déroulante
  • page rechargements avec de nouvelles données dans le gridview

So far so good

J'ai ensuite ajouté une zone de texte à la vue du réseau (pas je ne peux pas utiliser la norme lien « modifier ») La zone de texte est dans un itemtemplate

cette zone de texte contient des données modifiables pour l'utilisateur de mettre à jour et envoyer retour au serveur avec un clic du bouton de mise à jour.

Le problème est si je change la sélection dans la liste déroulante des mises à jour gridview comme il se doit, mais les zones de texte conservent l'ancienne valeur, même si elles sont liées avec <% # Bind (« vr_total »)%>

I peut seulement supposer que cela est provoqué par les données de publication et que les données sont remplacées après la liaison. (sinon la liaison écraserait les anciennes données indésirables)

Quelqu'un peut-il expliquer comment je peux changer ce comportement.

viewstate est définie sur false

Je suis nouveau .net C#

DC

Un autre développement ..

Si je remplace le < asp: zone de texte avec entrée < type = "text" value = "<% # Eval (" vr_total ")%>" ...> la grille fonctionne exactement comme prévu. Le problème semble être que la grille renseigne ses contrôles enfants lorsque les données sont liées, mais que la zone de texte l'écrase avec ce qui a été posté (via l'événement de publication dans la liste déroulante) même si son état est désactivé.

+0

D'après ce que je lis ici, il semble que nous ne disposons toujours pas assez d'informations pour répondre ta question. Que se passe-t-il lorsque l'utilisateur clique sur le bouton Mettre à jour? Avez-vous vérifié que le code dans le gestionnaire d'événements Click du bouton Update est activé? Si oui, ce code est-il correctement déclenché? Pourriez-vous fournir plus d'informations à ce sujet? –

+0

Nous pouvons ignorer le bouton de mise à jour en toute sécurité. il ne s'applique que lorsque l'utilisateur décide de mettre à jour les modifications qu'il a apportées. mais pour le bien d'une réponse oui, l'événement click est déclenché pour le bouton. La grille affiche uniquement les données sans fonctionnalité de mise à jour. J'ai ajouté un champ d'étiquette à la grille et il change correctement. Plus de lecture m'a amené à cette page http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx qui infère que les textboxes maintiennent leur propre viewstate ce qui explique pourquoi la désactivation de viewstates n'aide pas. Malheureusement aucune idée d'une solution de contournement – DeveloperChris

Répondre

3

Chris, Les contrôles ont ce que l'on appelle ControlState, que vous ne pouvez pas désactiver. Le problème que vous rencontrez est que vous chargez et liez le chargement de la page, puis une action est déclenchée par la suite.

La façon dont nous travaillons sur ce problème consiste à charger des données dans Page_Load et à lier des données dans OnPreRender.

par exemple:

private void Page_Load(object sender, System.EventArgs e) 
{ 
    grid.DataSource = whatever; 
} 

// your dropdown event occurs between these two events 

protected override void OnPreRender(EventArgs e) 
{ 
    grid.DataBind(); 
} 

Pour mieux comprendre ASP.NET ViewState, consultez http://msdn.microsoft.com/en-us/library/ms972976.aspx

+0

OnPrerender est l'astuce dont j'avais besoin, merci! Il est intéressant de noter que la base de données semble être implicite en changeant la SelectCommand pour la source de données. En d'autres termes Si je définis la propriété SelectCommand dans OnPreRender, je n'ai pas besoin d'appeler la méthode DataBind. il l'exécute de toute façon. Ce que j'ai fait est initialisé le SelectCommand à rien pour l'empêcher de fonctionner (supposé) et seulement le placer dans OnPreRender qui le remplit alors avec le nouvel ensemble de données. Très apprécié Jim DC – DeveloperChris

0

Databinding overwirtes uniquement les données lorsqu'elle est appelée usally avec un Page.DataBind, ce qui est normalement fait que sur la première get de la page, dans votre code derrière

override void OnLoad(){ 
    if(this.IsPostBack == false){ 
     this.DataBind(); 
    } 
} 

Ou quelque chose de similaire, lorsque votre le retour est en train de se passer, vous n'êtes pas de liaison de données. C'est habituellement le bon comportement. Si vous souhaitez re-Databind seulement la grille lorsque votre liste déroulante change, vous pouvez ajouter un gestionnaire d'événements sur le serveur onChange à votre liste déroulante et spécifiquement databind votre Gridview par exemple.

void OnDropDownChange(EventArgs args){ 
    gridView.DataBind(); 
} 

Probablement une bonne idée pour vous de lire plus sur la liaison de données car il est très important et très différent de beaucoup d'autres approches. http://support.microsoft.com/kb/307860 serait un endroit pour commencer.

+0

Merci le lien était utile. Dans ce cas, je ne veux databind même si c'est une publication. Parce que la publication en question modifie la source de données. par conséquent, les zones de texte doivent changer et ne pas conserver leur état de contrôle. – DeveloperChris