2010-07-11 3 views
0

J'ai conçu un contrôle utilisateur pour présenter une liste de questions à l'utilisateur. Ce contrôle "liste de questions" contient juste un répéteur. Il existe un large éventail de types de champs de question et de formulaire qui doivent être utilisés pour répondre à la question, de sorte qu'ils sont implémentés comme une gamme de contrôles "d'entrée de question" qui sont chargés dynamiquement dans ItemTemplate. Chaque contrôle d'entrée de question contient un bouton pour soumettre la réponse à cette question. La réponse soumise change souvent la liste des questions, donc après que toute réponse est soumise et enregistrée dans la base de données, je veux que la liste des questions soit rebondie.Lors de la reliure Repeater pour la 2ème fois (1er dans Page_Load, 2ème dans Page_Prerender) lignes en double apparaissent

Toutes ces travaille, sauf que lorsque la liste des questions est reprise après une réponse est soumise, la nouvelle liste contient des lignes dupliquées et aussi une rangée est porté disparu, comme suit:

liste d'origine:

Q1 
Q2 <---- Save button clicked on this question 
Q3 
Q4 

Nouvelle liste (Q2 dupliqués & 4ème trimestre manquant):

Q1 
Q2 
Q2 
Q3 

la façon dont je suis la soumission de réponse sur la dynamique Le contrôle d'entrée de question chargé pour relier la liste de questions était comme ceci:

Dans la liste de questions de la commande Page_Load, si Page.IsPostBack est vrai, j'appelle Repeater.DataBind(). Cela recrée les contrôles de saisie des questions et permet à leurs événements de cliquer sur les boutons. Le premier défi était le fait que ces événements étaient déclenchés APRÈS la fin du Page_Load du contrôle parent, mais j'ai trouvé un moyen de créer une propriété "ForceReload" sur le contrôle parent que le contrôle d'entrée de question pouvait définir sur True dans son événement click button. Ainsi, dans le fichier Page_PreRender du contrôle de liste de questions, je vérifie si ForceReload = true et si oui, j'appelle Repeater.DataBind() une seconde fois.

C'est dans ce 2ème databind que l'étrangeté se produit. Si je parcours le code, je peux voir le DataItem correspondant à la question qui a été soumise à deux reprises. Cependant, la requête SQL exécutée la deuxième fois est la même que celle exécutée la première fois et les enregistrements renvoyés sont les mêmes (c'est-à-dire qu'il n'y a pas de doublons dans les résultats la deuxième fois).

J'imagine que j'ai besoin de faire une sorte de "réinitialisation" du répéteur avant de le lier une deuxième fois, mais je ne vois aucune fonction pour le faire.

Cause possible .... la clé unique pour la question change entre le 1er databind et le 2nd. Je sais que ça sonne bizarre, mais c'est ainsi que fonctionne la base de données - une question qiven peut avoir un identifiant unique de "-123" dans son état "sans réponse" et ensuite "123" dans son état "répondu". Si je force l'ID à staty, le problème ne se pose pas. L'identifiant changeant est lié au fait que la source de données est une vue plutôt qu'une table, et de toute façon je ne peux rien y faire. Et pourquoi le répéteur se soucie-t-il quand il n'a aucune idée de ce qu'est l'ID unique? MISE À JOUR: Après plus de tests, il s'agit certainement d'un problème LINQ plutôt que d'un problème de répéteur ou de SQL. Voici un exemple simple:

Données extraites le 1er reliure:

QuestionID QuestionNumber Answer 
---------- -------------- ------ 
-1   1     null 
-2   2     null 
-3   3     null 
-4   4     null 

question, alors n ° 2 est soumis, et le rebond de la liste. Données récupérées sur la deuxième liaison:

QuestionID QuestionNumber Answer 
---------- -------------- ------ 
-1   1     null 
2   2     My answer 
-3   3     null 
-4   4     null 

Les données sont donc exactes.Cependant cela est transformé par LINQ en 4 objets avec les propriétés suivantes:

QuestionID QuestionNumber Answer 
---------- -------------- ------ 
-1 (OK)  1 (OK)   null (OK) 
2 (OK)  2 (OK)   My answer (OK) 
-3 (OK)  2 (wrong)   My answer (wrong) 
-4 (OK)  3 (wrong)   null (OK) 

Ainsi, dans chaque objet la propriété clé (QuestionID) est correcte, mais dans les objets après la question qui a obtenu mis à jour, les autres propriétés sont tiré du précédent record!

Répondre

0

Tout d'abord, la personne qui a conçu une base de données qui modifie l'ID unique de l'enregistrement lors de sa mise à jour ou de sa réponse appartient à une autre industrie. Je suggère qu'ils deviennent un écrivain de fantasy ou un physicien de quatumn, bien que s'ils essayent le dernier ils pourraient finir par essayer de sauver le disque dans trois états à la fois. Ils vont probablement argumenter que -123 et 123 sont des états différents du même identifiant, mais ils ont tort. Ce sont des numéros différents et sont traités comme tels par tous les systèmes informatiques dont je suis au courant. Ils auraient dû avoir un drapeau booléen appelé IsAnswered ou quelque chose. Mais vous dites que vous ne pouvez pas changer cela, alors j'ai besoin de plus d'informations pour répondre à votre question.

Essentiellement, l'identifiant est probablement la racine de votre problème, comme vous le suggérez. Pourriez-vous poster le code derrière pour votre contrôle? Je voudrais voir comment vous mettez à jour la base de données.

+0

C'est certainement un problème LINQ plutôt qu'un problème SQL, donc je ne pense pas que mon code de mise à jour soit pertinent. J'ai ajouté plus d'informations à mon message original ci-dessus (voir MISE À JOUR). – Laurence

+0

Si QuestionNumber est unique et séquentiel, ne pouvez-vous pas le traiter comme votre identifiant unique, en le sélectionnant et en le mettant à jour? –

+0

Non. J'ai descendu les données pour les rendre plus faciles à expliquer - ce n'est pas vraiment unique. – Laurence

Questions connexes