父类和子类在同一张表
现在出现了父类和子类一般都会存在一张表中,然后设计数据库的时候把父类的ID存到子类另一个字段中就实现了关联。
例如: 网站的左边导航 第一层就可以看做父类,里面就可以看做子类。
我们就先来看看怎么做导航。
效果图:
一切为了用户,这个只显示一个下面出来,不要显示多个不然很难看
① 前台页面
<div ><ul id="test" ><asp:Repeater ID="replist" runat="server" OnItemDataBound="replist_ItemDataBound"><ItemTemplate><li><a class="one" href="javascript:void()"><em><%# Eval("Name")%></em></a><ul style="display: none;"><asp:HiddenField ID="hfId" runat="server" Value='<%# Eval("ID") %>' /><asp:Literal ID="LitFirst" runat="server"></asp:Literal> //这个标签用来替换数据</ul></li></ItemTemplate></asp:Repeater></ul></div><script src="../JS/jquery-1.11.0.min.js"></script><script>$("ul#test").on("click", "li", function () {//$("ul li ul").css("display", "none");if ($(this).hasClass("show")) {$("ul#test li").removeClass("show");Test();//$(this).removeClass("show");// $(this).find("ul").css("display", "none");} else {$("ul#test li").removeClass("show");$(this).addClass("show");Test();//$(this).find("ul").css("display", "block"); }});//用来隐藏和显示下面的数据function Test(){$("ul#test li").each(function () {if ($(this).hasClass("show")) {$(this).find("ul").css("display", "block");} else {$(this).find("ul").css("display", "none");}});}</script>
②样式 简单设置一下
<style>ul {list-style:none;}em {font-style: normal;}a {text-decoration:none;}</style>
③取数据 由于我们搭建的div的原因,想要显示出所有的数据需要用到Repter里面的数据绑定事件
protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){Binging();}}private void Binging(){DataSet ds = new FunctionDemo.BLL.Category().GetList("Pid=0");replist.DataSource = ds.Tables[0];replist.DataBind();}/// <summary>/// 每绑定一行就触发一次 一般这个方法用来加载每一行的子类数据/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void replist_ItemDataBound(object sender, RepeaterItemEventArgs e){ Literal LitFirst = (Literal)e.Item.FindControl("LitFirst");HiddenField hfId = (HiddenField)e.Item.FindControl("hfId");List<FunctionDemo.Model.Category> cateModel = new FunctionDemo.BLL.Category().GetModelList("Pid=" + hfId.Value);foreach (FunctionDemo.Model.Category item in cateModel){LitFirst.Text = LitFirst.Text + "<li>"+item.Name+"</li>";}}
④数据的设计
父类 Pid=0 子类的Pid就是父类的ID LevalNum用来表示
第一种父子类就说到这,下面说的是第二种方式
其中的有个方法值得学习下
我们换成下拉框来试试 按分类显示数据 列: 父类 子类 父类 子类 。。
①页面
<form id="form1" runat="server"><asp:DropDownList ID="ddlDemo" runat="server"></asp:DropDownList></form>
②代码
public FunctionDemo.BLL.Category categoryBLL = new FunctionDemo.BLL.Category();protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){BingDDL();}}public void BingDDL(){DataTable dt = categoryBLL.GetList("").Tables[0]; //categoryBLL.GetListChild(0, true);ddlDemo.Items.Add(new ListItem("类别", "0"));foreach (DataRow item in dt.Rows){string title = "";if (int.Parse(item["LevalNum"].ToString()) > 0){title =" " + "|--" + item["Name"].ToString();}else{title = item["Name"].ToString();}ddlDemo.Items.Add(new ListItem(title, item["ID"].ToString()));}}
③显示效果
这一切尽是如此的完美,好像很好一样的。
我们做项目时并不是说所以的东西都是好的,很可能做了一半让你加几条数据,我们来试一试 NBA 加一条 ,爱好加一条,别找我加一条
我们的数据
然后再显示
我们如何把NBA子类往上面移动呢,这是问题的关键,那么就是查询数据的问题了。
我们改动了取数据的方法
然后显示数据
这样很符合我们的要求。
我们来看看这个方法写了什么。
/// <summary>/// 获取全部类别/// </summary>/// <param name="strWhere">后面的bool值可以显示是否显示禁用的数据,这里并没做处理</param>/// <returns></returns>public DataTable GetListChild(int PID, bool isState){StringBuilder strSql = new StringBuilder();strSql.Append("select ID,Name,Pid,LevalNum");strSql.Append(" FROM Category ");//strSql.Append(" Where ParentId=" + PId);if (isState){strSql.Append("Where 1=1 ");}strSql.Append(" order by Id asc");DataSet ds = DbHelperSQL.Query(strSql.ToString()); 我们的数据查找完了,跟以前是一样的DataTable oldData = ds.Tables[0] as DataTable;if (oldData == null){return null;}//复制结构DataTable newData = oldData.Clone(); clone()是基类Object的方法//调用迭代组合成DAGATABLE 用旧数据得到新数据 GetChannelChild(oldData, newData, PID);return newData;}/// <summary>/// 获取子类别/// </summary>/// <param name="parentId">父编号</param>/// <param name="stateInfo">状态</param>/// <returns></returns>private void GetChannelChild(DataTable oldData, DataTable newData, int PId){//第一遍进来的时候是获取父类 pid=0 我们只需每取一条父类数据,然后把改类的子类数据先加载进去就可以了DataRow[] dr = oldData.Select("Pid=" + PId);for (int i = 0; i < dr.Length; i++){//添加一行数据 DataRow row = newData.NewRow(); row["ID"] = int.Parse(dr[i]["ID"].ToString());row["Name"] = dr[i]["Name"].ToString();row["Pid"] = dr[i]["Pid"].ToString();row["LevalNum"] = dr[i]["LevalNum"].ToString(); newData.Rows.Add(row);//调用自身迭代this.GetChannelChild(oldData, newData, int.Parse(dr[i]["ID"].ToString()));//把父类的ID作为条件传进去,子类的数据就会出来 }}
这个方法是一种思想,会的话可以做别的事。
上面是满足我们的原数据和新数据都是在一张表,我们就可以用clone()方法,如果我的新表需要添加字段
//创建一个新的DataTable,这里可以添加我们的列DataTable newData = new DataTable();newData.Columns.Add("id", typeof(int));newData.Columns.Add("parent_id", typeof(int));newData.Columns.Add("class_layer", typeof(int));newData.Columns.Add("nav_type", typeof(string));newData.Columns.Add("name", typeof(string));newData.Columns.Add("title", typeof(string));newData.Columns.Add("sub_title", typeof(string));newData.Columns.Add("icon_url", typeof(string));newData.Columns.Add("link_url", typeof(string));newData.Columns.Add("sort_id", typeof(int));newData.Columns.Add("is_lock", typeof(int));newData.Columns.Add("remark", typeof(string));newData.Columns.Add("action_type", typeof(string));newData.Columns.Add("is_sys", typeof(int));
//调用迭代组合成DAGATABLE 用旧数据得到新数据GetChannelChild(oldData, newData, PID);return newData;
//在GetChannelChild()这个方法里面的添加数据里面就可以把新列的数据添加进去
转载于:https://www.cnblogs.com/Sea1ee/p/7028595.html
父类和子类在同一张表相关推荐
- hibernate继承关系映射方法(三)--每个具体类一张表TPC
TPC:所谓是"每个具体类一张表(table per concrete class)"的意思是:使继承体系中每一个子类都对应数据库中的一张表.每一个子类对应的数据库表都包含了父类的 ...
- Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表
Hibernate继承(2)子类属性生成在自己的一张表中,父类的属性一张表 <?xml version="1.0"?> <!DOCTYPE hibernate-m ...
- hibernate继承关系映射关系方法(二)--每个子类一张表
TPS:所谓"每个子类一张表(Table Per Subclass)":父类一张表,每个子类一张表,父类的表保存公共有信息,子类的表只保存自己特有的信息 这种策略是使用<jo ...
- 继承-----具体表继承-----每个子类一张表
1.具体表继承:每个子类一张表,如果父类不是定义为抽象的,则父类也是一张表 (1)使用<joined-subclass>标签来定义子类. (2)父类和子类都对应一张表. (3)在父类对应的 ...
- 最新 ECSHOP v2.7.3数据表(88张表)
2019独角兽企业重金招聘Python工程师标准>>> 目前ecshop最新版本为2.7.3,数据表也已经新增到了88张.在网上查了数据表的释义,以前老版本的要么60几张表,要么70 ...
- hibernate继承关系映射方法(一)--共享一张表
对于如下关系: Person.java package com.hust.PO;public class Person {private Integer id;private String name; ...
- SSM实战-外卖项目-06-用户地址簿功能、菜品展示、购物车、下单(一个业务涉及5张表)
文章目录 外卖项目-第六天 课程内容 1. 用户地址簿功能 1.1 需求分析 1.2 数据模型 1.3 导入功能代码 1.4 功能测试 (其实需求分析里我就自己写了一份代码,而且测试过了,下面再测试了 ...
- 使用hibernate映射oracle两个表空间的表,Hibernate每个具体类一张表映射(使用XML)
在每个具体类一个表中,数据库中将有三个表但彼此之间没有关系(关联). 根据具体类策略将表格映射到表有两种方法. 由union-subclass元素指定 通过自我为每个类创建表 我们来了解映射的层次结构 ...
- C++父类与子类间构造,析构,拷贝的调用关系
C++父类与子类间构造,析构,拷贝的调用关系 构造 子类的构造在执行它的构造函数前会根据继承表的顺序执行父类的构造函数 默认执行无参构造 #include <iostream> #incl ...
最新文章
- libopencv_core.so.2.4: cannot open shared object file: Depends: libopencv-photo2.4v5
- 为何python不好找工作k-为什么我不建议你通过 Python 去找工作?
- springboot @RequestBody 接收字符串
- spring-data-jpa
- R语言实战(七)图形进阶
- T-SQL RIGHT JOIN
- [转]TortoiseSVN客户端重新设置用户名和密码
- 计算机演示题打不开,大神为你演示win7系统计算机上右键管理打不开的还原技巧...
- ssms 和sql_使用T-SQL和SSMS监视事务日志传送
- 「leetcode」C++题解:226.翻转二叉树,递归法与迭代法详解
- 20. Element innerHTML 属性
- python总是下载失败_Python 下载依赖包环境经常失败超时解决方法
- 将你的掘金小册制作成一整本PDF
- usb无线网卡linux驱动,Linux系统下安装USB无线网卡驱动方法
- StretchDIBits
- 导数定义考法一网打尽
- App上架安卓应用市场最全指南
- [html] 你有使用过blockquote标签吗?说说它的用途有哪些?
- 互联网日报 | 格力首款5G手机开售;拼多多内测多多钱包功能;跟谁学宣布定增融资8.7亿美元...
- 支付宝直付通实现账单结算(分账)功能完整Demo