父类和子类在同一张表
現在出現了父類和子類一般都會存在一張表中,然后設計數據庫的時候把父類的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
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的父类和子类在同一张表的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 鼠标滚轮事件绑定的兼容性问题
- 下一篇: 排球积分程序(三)——模型类的设计