无限分级Repeater递归实现:读取一次数据库,使用LINQ2SQL技术,支持排序&显示隐藏

预览效果图:

Selenium

数据库结构:

id(int)    classname(string)   parentid(int) sort(int用于显示与排序)

1  家居  0  1

2  家电  0  2

3  沙发  1  1

4  某...   3      1

...

10   ...红色   4      1

注:

parentid  父节点ID

sort 用于隐藏或显示 兼排序功能

前台:

<asp:Repeater ID="rep" runat="server" onitemdatabound="rep_ItemDataBound">
<HeaderTemplate></HeaderTemplate>
<ItemTemplate></ItemTemplate>
<FooterTemplate></FooterTemplate>
</asp:Repeater>

后台:

代码

public partial class 递归2 : System.Web.UI.Page
{
    public List<cmodel> list;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            rules r = new rules();
            list = r.getlist();//读取数据库
            this.rep.DataSource = list.Where(x => x.parentid == 0).ToList();//LINQ2OBJECT
            this.rep.DataBind();
        }
    }

protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Header)
        {
            Literal l = new Literal();
            l.ID = "ul";
            l.Text="<ul>";
            e.Item.Controls.Add(l);
        }
        else if (e.Item.ItemType == ListItemType.Footer)
        {
            Literal l = new Literal();
            l.ID = "ul2";
            l.Text = "</ul>";
            e.Item.Controls.Add(l);
        }
        else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            int id = (int)DataBinder.Eval(e.Item.DataItem, "id");
            Literal li1 = new Literal();
            li1.ID = "li1";
            li1.Text = "<li>";
            e.Item.Controls.Add(li1);

Literal name = new Literal();
            name.ID = "n";
            name.Text = DataBinder.Eval(e.Item.DataItem, "classname").ToString();
            e.Item.Controls.Add(name);
            List<cmodel> temp = list.Where(x => x.parentid == id).ToList();//LINQ2OBJECT
            if (temp.Count > 0)
            {
                Repeater r = new Repeater();
                TemplateBuilder tb = new TemplateBuilder();
                tb.AppendLiteralString("");
                r.HeaderTemplate = tb;
                r.FooterTemplate = tb;
                r.ItemTemplate = tb;
                r.ItemDataBound += new RepeaterItemEventHandler(rep_ItemDataBound); //递归核心
                r.DataSource = temp;
                r.DataBind();
                e.Item.Controls.Add(r);
            }
            Literal li2 = new Literal();
            li2.ID = "li2";
            li2.Text = "</li>";
            e.Item.Controls.Add(li2);
        }
    }

}

使用到的类:

代码

public class rules
{
    DataClasses1DataContext dc = new DataClasses1DataContext();

public List<cmodel> getlist()
    {
        var q = from x in dc.ClassFJ
                where x.sort > 0  //用于控制显示隐藏
                orderby x.sort    //兼职排序功能
                select new cmodel
                (
                    x.id,
                    x.className,
                    x.parentid
                );
        return q.ToList<cmodel>();
    }
}

public class cmodel
{
    public cmodel(int i,string n,int p)
    {
        id = i;
        classname = n;
        parentid = p;
    }
    public int id { get; set; }
    public string classname { get; set; }
    public int parentid { get; set; }
}

抛砖引玉,话不多讲。

时间: 2024-10-07 04:50:31

无限分级Repeater递归实现:读取一次数据库,使用LINQ2SQL技术,支持排序&amp;显示隐藏的相关文章

无限分级和tree结构数据增删改【提供Demo下载】

无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以下都是自己捣鼓的结果,非标准.谁有更好的设计望不吝啬赐教. 说来其实也简单,就是一个ID和父ID的关系. 以此类推,Id需要是唯一的,ParenId需要是Id列里面存在即可.这样我们就实现无限分级了,如果再加一列Sort排序就更完美了. jstree插件 官方地址:https://www.jstre

采用左右值编码实现无限分级树形结构(转)

无限分级树形结构是在系统开发中很常见的,如下图 在之前实现这样的菜单一直是使用传统的方法,看数据表结构就一目了然 parent_id记录其直接父节点,组合树形结构的关键字段:parent_list记录其所有父节点,便于查询某个节点下所有子节点(一般使用MySQL的FIND_IN_SET函数),相对冗余.对于这种结构生成树形的关键算法:根据parent_id组合一个父子(直接关系)节点映射表,即 2 => array(3, 4), 3 => array(5),然后递归优先遍历每个节点的子节点.如

数据库无限分级(分类表)

在数据库中我们经常会做这样一件事:创建了一个分类表,再创建一个子分类,有多少级我们就习惯创建多少张表. 这样不仅耗费大量时间而且还会在操作表的时候陷入混乱,这里我介绍一种办法:无限分级. 通过这种方式,我们仅需要创建一张表就能将不管多少级分类全部放入. 首先我们理清一下思想,在这张表中我们要有个编号(ID),和一个父编号(ParentID) 我们在放入数据的时候就可以用ParentID去区别这个ID属于那个分级,而且通过这个ParentID,我们就可以实现无限分级,就是使用这个ID不断作为Par

SharePoint2010沙盒解决方案基础开发——开发webpart读取绑定列表数据,并以一定的格式显示(加css样式)

SharePoint2010沙盒解决方案基础开发——开发webpart读取绑定列表数据,并以一定的格式显示(加css样式) 分类: SharePoint2011-12-22 15:13 1974人阅读 评论(2) 收藏 举报 sharepointcss2010classbordernull SharePoint2010沙盒解决方案基础开发——开发webpart读取绑定列表数据,并以一定的格式显示(加css样式) 注:此实例无需添加数据控件,避免了一些繁琐的代码 实现效果如下: 读取数据和图片,并

读取文本文件插入数据库

做了一个读取加密文件经过解密后插入数据库的功能,如果在数据库中没有该ID号(唯一)的记录则执行插入操作,如果该数据库中存在该ID的记录好么执行更新操作.本次选择文件采用的是 FileUpload控件,但这个控件在浏览器中如果设置不好通过FileUpload1.FileName或FileUpload1.PostedFile.FileName得到的只是文件名而不是全路径,而StreamReader sr = new StreamReader(url, Encoding.GetEncoding("GB

C#改变LInqToSQL的引用地址,读取config的数据库字符串

C#改变LInqToSQL的引用地址,读取config的数据库字符串修改Properties 下 Settings.Settings 下 Settings.Designer.cs 下 return ((string)(this["ConnectionString2"])):修改为 Return ConfigurationManager.ConnectionStrings["connString"].ToString();//connString 为自己的数据库配置串

jsp中用EL读取了数据库里面的时间,怎么设置格式显示的格式

jsp中用EL读取了数据库里面的时间,怎么设置格式显示的格式 首先导入标签 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> <input type="text" value="<fmt:formatDate value="${viewKq.srq}" pattern="yyyy-M-d" /&g

VS中C#读取app.config数据库配置字符串的三种方法(转)

VS中C#读取app.config数据库配置字符串的三种方法(转) http://hi.baidu.com/mindox/item/3278dc352c7ba68fb80c0389 http://www.blogjava.net/keweibo/articles/391207.html 关于VS2008或VS2005中数据库配置字符串的三种取法 VS2008建立Form程序时,如果添加数据源会在配置文件 app.config中自动写入连接字符串,这个字符串将会在你利用DataSet,SqlDat

Python:读取Excel表格时出现的u&#39;\u51c6’ 无法正确显示汉字

读取Excel后,想显示其中一行的元素,结果读出来是这样[u'\u51c6\u8003\u8bc1\u53f7', u'\u8003\u751f\u59d3\u540d'],始终不显示正常的汉字 依照网上的方法直接print()即可输出,试验后发现确实可以,不过一次只能输出一个元素,多余一个元素则依旧 后查找得知解决方法:需要用到json库 1 import json 2 #……文件的读取略去 3 #json.dumps(A).decode("unicode-escape") 4 #这