Asp.net 嵌入式中继器的处理深度

Asp.net 嵌入式中继器的处理深度,asp.net,stored-procedures,Asp.net,Stored Procedures,我有一个设计问题。我有一个嵌套的中继器结构,它有4层深。中继器显示被视为第1-4节的数据。这些部分都在数据库中与工作描述相关联 我想在中继器最深层的每个项目中添加一个编辑按钮。然而,中继器的深度并非都相等。一份工作描述可以有多个条目用于第1-4节,因此需要转发器。然而,如前所述,一个给定的区段条目可能是1-3。。。然后1-4。。。也许只是第一部分 另一个使这个问题变得棘手的先决条件是,它被设计为一次只绑定到一个层。然后,他们单击一个向下搜索img按钮,该按钮将下一组数据绑定到内部中继器。因此,这

我有一个设计问题。我有一个嵌套的中继器结构,它有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:标签按节ID标识每个单独的转发器项

维护一个字典,将一个部分映射到它的深度。利用存储过程。但是,只有在钻取项目时才可以输入。这样做是轻量级的,我只跟踪用户感兴趣的项目

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


他们对我的解决方案还有其他想法或问题吗?

答案其实很直截了当。执行所有这些跟踪充其量是一种笨拙的方法。解决方案要简单得多。我不是最熟练的存储过程编写者,所以请容忍我在这方面的错误。如果有人想展示一个更易于维护和整洁的版本,那就太棒了

解决方案是创建一组存储过程,以查看与其相关联的下一节记录

bit doesSection2RecordExist(int prevSectID)
bit doesSection3RecordExist(int prevSectID)
bit doesSection4RecordExist(int prevSectID)
这些都返回一个位,即SP名称所隐含的语句的真或假

现在只需将这些绑定到一个整洁的方法中,请记住,我的公司正在使用一种模式方法,因此对于某些人来说,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事件中完成的

另一个注意事项是,我使获取正确的前一节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重复这一点

我希望这对将来遇到类似情况的人有所帮助