日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

父类和子类在同一张表

發布時間:2024/4/15 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 父类和子类在同一张表 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

現在出現了父類和子類一般都會存在一張表中,然后設計數據庫的時候把父類的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年碼齡,通宵達旦的技術人生

總結

以上是生活随笔為你收集整理的父类和子类在同一张表的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。