2010-11-19 33 views
0

我有一个设计问题。我有一个4层深的嵌套中继器结构。中继器显示被视为“第1-4节”的数据。这些部分都与数据库绑定到一个职位描述。处理嵌入式中继器的深度

我想添加一个编辑按钮到中继器最深层的每个项目。但是,中继器的深度并不完全相同。工作描述可以为每个部分(1-4)有多个条目,因此需要中继器。如前所述,尽管如此,一个给定条目的条目可能是1-3 ...然后1-4 ...甚至可能只是第一部分。

使这个棘手的一个额外的先决条件是它被设计为一次绑定到一个层次。然后他们点击钻取img按钮,将下一组数据绑定到内部中继器。所以这比简单计算绑定次数更困难。

所以我的问题是我可以使用哪种编程结构,推导给定条目的深度会相对较快?显然,考虑到我有一个到期日期,一个不需要大量时间的解决方案将会是惊人的。

这是表结构。请记住它不可更改。这是在更多时间之前。

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

直放站结构

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

我的一些想法。

创建一个计算条目深度的存储过程。传入SectID并返回相对于SectID的深度。我已经有了一个适当的结构来通过一个隐藏的asp:标签,通过Section ID来识别每个单独的repeater项目。

维护一个词典,用于将节映射到其深度。利用存储过程。但是,只有在钻取项目时才能输入。这种方式很轻便,我只跟踪用户感兴趣的项目。

每次用户向下钻取时,检查深度是否相等......如果是,则显示编辑img按钮,如果不是,则钻取并增加字典中的值。

他们在我的解决方案中预见到的任何其他想法或问题?

回答

0

答案其实非常简单。执行所有这些跟踪是最好的一个笨拙的方法。解决方案比这要简单得多。我不是最熟练的存储过程作家,所以对此非常感兴趣。如果有人倾向于展示更加可维护和整洁的版本,那将是非常棒的!

的解决方案是创建一组存储过程偷窥在与它

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

这些所有相关下一节记录返回位即真或假有关SP的名称所暗示的声明(请记住,我的公司正在使用Schema方法,因此db访问代码对某些人来说看起来可能有些不同,但db访问实现细节并不是您需要的依赖关系关注于。

public enum SectionType { First, Second, Third, Fourth }; 

    public static bool HasNextSection(int prevSectID, SectionType sectNum) 
    { 
     if (sectNum > SectionType.First) 
     { 
      var procName = "Section" + (int)sectNum + "RecordExists"; 
      using (var ov = new OneValue(Product.SafetyObs, procName)) 
      { 
       ov["PrevSectID"] = prevSectID; 
       return ov.Value.Bool; 
      } 
     } 
     return false; 
    } 

最后一步是在适当的时间进行调用以检查是否存在更深的层级记录。这是在直放站的OnBound事件中完成的

另一个需要注意的是我抓住了正确的以前的Section ID更简化。我在绑定时将其存储在标签中的每个层级并使其不可见。

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; 
    } 

,然后我只是重复与所有内部中继2-4

我希望这可以帮助任何人跑入在今后类似的东西!