1. 程式人生 > >ASP.NET DataList巢狀實現評論效果

ASP.NET DataList巢狀實現評論效果

問題:

Datalist1顯示say這個表的資料
這裡寫圖片描述
然後想在Datalist1中巢狀一個Datalist2用於顯示對應的評論
這裡寫圖片描述
表2的 sayID對應表1的id,若表2中找不到對應sayId則在對應的Datalist1中不顯示Datalist2.
難點在於如何達到“林夏”的說說下面只顯示“黃磊”、“葉偉信”的評論,“韓寒”的下面只顯示“程程”的評論。(林夏的id是3,所以查詢對應的表2中sayId為3的行)。

程式碼

前臺程式碼:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <link href="Content/bootstrap.css" rel="stylesheet" /> </head> <body> <form id="form1" runat="server"> <h2 style="text-align:center;">評論列表</h2>
<div align="center" style="margin-top:20px;"> <asp:DataList ID="DataList1" runat="server" OnItemDataBound="DataList1_ItemDataBound" Width="50%" CssClass="table table-bordered" CellPadding="0" CellSpacing="0"> <ItemTemplate> <div
>
來自<%# Eval("place") %><%# Eval("username") %><%# Eval("date") %>發表 </div> <div> <%# Eval("text") %> </div> <asp:DataList ID="DataList2" runat="server" Width="100%"> <ItemTemplate> <div style="border: 1px dashed black; margin: 1px;"> <div> <%#Eval("username") %>的評論<%#Eval("date") %> </div> <div>評論內容:<%#Eval("text") %> </div> </div> </ItemTemplate> </asp:DataList> </ItemTemplate> </asp:DataList> </div> </form> </body> </html>

後臺cs:

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                this.DataList1.DataSource = Data();
                this.DataList1.DataBind();
            }
        }

        public DataSet Data()
        {
            DataSet ds = new DataSet();

            DataTable dtParent = new DataTable();
            dtParent.Columns.Add("id", typeof(int));
            dtParent.Columns.Add("username", typeof(string));
            dtParent.Columns.Add("text", typeof(string));
            dtParent.Columns.Add("date", typeof(string));
            dtParent.Columns.Add("place", typeof(string));

            dtParent.Rows.Add(1, "摩根", "這個...", "2014.6", "倫敦");
            dtParent.Rows.Add(2, "韓寒", "潮流...", "2015.7", "湖南");
            dtParent.Rows.Add(3, "林夏", "歲月...", "2016.2", "小城");
            dtParent.Rows.Add(4, "王菲", "我會...", "2015.9", "香港");
            dtParent.Rows.Add(5, "郭敬明", "我們...", "2015.1", "上海");

            DataTable dtChild = new DataTable();
            dtChild.Columns.Add("id", typeof(int));
            dtChild.Columns.Add("sayId", typeof(int));
            dtChild.Columns.Add("username", typeof(string));
            dtChild.Columns.Add("text", typeof(string));
            dtChild.Columns.Add("date", typeof(string));
            dtChild.Rows.Add(1, 3, "黃磊", "我是第一個評說", "2016.6.17 13:06:12");
            dtChild.Rows.Add(3, 3, "葉偉信", "評論林夏的說", "2016.6.17 12:26:43");
            dtChild.Rows.Add(4, 2, "程程", "我評論韓寒", "2015.3.1 15:20:10");

            ds.Tables.AddRange(new DataTable[] { dtParent, dtChild });

            DataRelation dr = new DataRelation("relation", dtParent.Columns["id"], dtChild.Columns["sayId"]);
            ds.Relations.Add(dr);

            dtParent = ds.Relations["relation"].ParentTable;
            dtChild = ds.Relations["relation"].ChildTable;
            return ds;
        }

        protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
        {
            if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
            {
                DataList dataList = e.Item.FindControl("DataList2") as DataList;
                DataRowView rowv = (DataRowView)e.Item.DataItem;

                DataRow[] rows = Data().Tables[1].Select("sayId='" + rowv["id"].ToString() + "'");
                DataTable dt = Data().Tables[1].Clone();
                foreach (DataRow dr in rows)
                {
                    dt.ImportRow(dr);
                }
                dataList.DataSource = dt;
                dataList.DataBind();
            }
        }

後臺程式碼中資料來源部分可以用ado.net查詢資料庫方式替換。

效果圖:

這裡寫圖片描述