2010-11-19 17 views
0

J'ai une question de conception. J'ai une structure de répéteur imbriquée qui a 4 niveaux de profondeur. Les répéteurs affichent des données qui sont considérées comme "Sections 1-4". Ces sections sont toutes liées dans une base de données à une description de travail.Profondeur de traitement des répéteurs intégrés

Je souhaite ajouter un bouton d'édition à chaque élément du niveau le plus profond des répéteurs. Cependant, les profondeurs du répéteur ne sont pas toutes équivalentes. Une description de travail peut avoir plusieurs entrées pour chaque section (1-4), d'où la nécessité de répéteurs. Le crochet cependant, comme indiqué précédemment, est qu'une entrée donnée de sections peut être 1-3 ... puis 1-4 ... peut-être même juste la première section.

Une condition préalable supplémentaire qui rend cette tâche difficile est qu'elle a été conçue pour ne se lier qu'à un niveau à la fois. Ensuite, ils cliquent sur un bouton img vers le bas qui lie le jeu de données suivant au répéteur interne. Donc, cela rend plus difficile que de simplement compter le nombre de fois que vous vous liez à lui. Donc, ma question est de savoir quelle construction de programmation pourrais-je employer qui serait relativement rapide pour déduire la profondeur d'une entrée donnée? De toute évidence, une solution qui ne nécessiterait pas une quantité supplémentaire de temps serait étonnante compte tenu de ma date d'échéance.

Voici la structure de la table. Gardez à l'esprit que ce n'est pas modifiable. C'était avant plus de temps.

Table  FK   PK 
Section1 | JobID | Sect1ID | 
Section2 | Sect1ID | Sect2ID | 
Section3 | Sect2ID | Sect3ID | 
Section4 | Sect3ID | Sect4ID | 

Structure Repeater

<Repeater 1> 
    <Section 1 Data> 
    <Repeater 2> 
      <Section 2 Data>   
      <Repeater 3> 
       <Section 3 Data> 
       <Repeater 4> 
        <Section 4 Data> 
       </Repeater> 
      </Repeater> 
     </Repeater> 
</Repeater> 

Certaines de mes idées.

Créez une procédure stockée qui calcule la profondeur d'une entrée. Passez dans SectID et renvoie la profondeur par rapport au SectID. J'ai déjà une structure en place pour identifier chaque élément répéteur par ID de section via un label asp: caché. Maintenir un dictionnaire pour mapper une section à sa profondeur. Utilisez la procédure stockée. Cependant, seulement une entrée lorsqu'un objet est foré. De cette façon, il est léger, et je ne fais que suivre les éléments qui intéressent l'utilisateur.

Chaque fois que l'utilisateur fore vers le bas, effectuez une vérification pour voir si les profondeurs sont égales ... si elles sont, puis afficher le modifier img, sinon, percez et incrémentez la valeur dans le dictionnaire.

d'autres idées ou problèmes qu'ils prévoient avec ma solution?

Répondre

0

La réponse était plutôt simple. effectuer tout ce suivi était une approche maladroite au mieux. La solution est beaucoup plus simple que cela. Je ne suis pas le plus compétent écrivain de procédure stockée alors portez-moi sur ce compte. Si quelqu'un est enclin à montrer une version plus facile et maintenable qui serait génial!

La solution est de créer un ensemble de procédures stockées qui jette un œil au prochain enregistrement de la section qui lui est associée

bit doesSection2RecordExist(int prevSectID) 
bit doesSection3RecordExist(int prevSectID) 
bit doesSection4RecordExist(int prevSectID) 

Tout cela renvoie un peu-à-dire Vrai ou faux au sujet de la déclaration implicite par le nom de la SP Maintenant gardez à l'esprit que mon entreprise utilise une approche Schéma pour que le code d'accès db puisse sembler quelque peu étranger à certains mais les détails d'implémentation de l'accès db ne sont pas une dépendance dont vous avez besoin. concerné par.La dernière étape consiste à effectuer l'appel au moment approprié pour vérifier s'il existe un autre enregistrement un niveau plus profond. Ceci est fait dans l'événement OnBound du répéteur

Une autre remarque est que j'ai fait en saisissant le bon ID de section précédente plus simplifié. Je le stocke à chaque niveau de niveau dans une étiquette pendant le temps obligatoire et le rend invisible.

protected void rptrSection1_Bound(object sender, RepeaterItemEventArgs e) 
    {       
     var lblID = e.Item.FindControl("lblSection1Id") as Label; 
     var sectID = int.Parse(lblID.Text); 

     if (!SectionLoader.HasNextSection(sectID, SectionType.Second)) 
     { 
      //things to do if there are no sections left 
     } 
     else 
     { 
      //things to do if there are sections left 
     } 

     return; 
    } 

puis je le répète simplement que tous les répéteurs internes 2-4

J'espère que cela aide à toute personne en cours d'exécution dans quelque chose de similaire à l'avenir !!