最近公司要做一個客戶展示系統:(類似調查問卷,并生成統計圖)涉及到了DataList嵌套DataList的問題,現在把自己的心得公布希望多多交流并且也在尋找更加簡單合適的方法!
用DataList嵌套DataList的意義 無非是想構造 類似樹型結構的展示功能(N大主題包括N小主題,每個大主題內嵌小主題)
比如我這次的項目是一個調查項目:要求結果是:
| 你喝過咖啡嗎?
|
| 你喜歡喝咖啡嗎?
|
| 您的月薪?
|
| 您的學歷?
|
其中紅色內容是題目,綠色內容是回答內容,由于數據庫設計時候一定會把問題和答案分開,且一個問題多個答案選擇(一對多關系),所以問題和答案
會在不同的表內且用一條語句無法實現按照此結構的順序結構(也就是用一個DataList無法完成最終的樣式).
那么我們便會用嵌套方法,既紅色部分為父DataList綠色部分為子DataList互相不干擾.
前臺代碼:
<%@ Import Namespace="System.Data" %>
<asp:DataList ID="Parent" runat="server" Height="134px" Width="133px" OnInit="Parent_Init">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text= <%# Eval("QuestionContent") %> Font-Bold="True" ForeColor="Red"></asp:Label>
<asp:DataList ID="Child" runat="server" datasource= <%# ((DataRowView)Container.DataItem).Row.GetChildRows("Myrelations") %> ForeColor="Green">
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text= <%# DataBinder.Eval(Container.DataItem, "[\"AnswerContent\"]")%> ></asp:Label>
</ItemTemplate>
</asp:DataList>
</ItemTemplate>
</asp:DataList>
注意:代碼綠色部分分別為這個項目 問題的綁定與選擇答案的綁定.
代碼紅色部分為子DataList的數據源綁定 "Myrelations"為問題與選擇答案表的關系名稱(關于這個關系名稱的由來下面的代碼中將介紹)
后臺代碼:
String connStr = ConfigurationManager.ConnectionStrings["ResearchProjectConnectionString"].ConnectionString; //讀取WEB.CONFIG連接字符串
SqlConnection conn = new SqlConnection(connStr);
SqlDataAdapter SqlDa1 = new SqlDataAdapter("select * from Question", conn); //遍歷問題表
SqlDataAdapter SqlDa2 = new SqlDataAdapter("select * from Answer", conn);//遍歷回答表
DataSet ds = new DataSet();
SqlDa1.Fill(ds,"Question");
SqlDa2.Fill(ds,"Answer");
ds.Relations.Add("Myrelations", ds.Tables["Question"].Columns["QuestionOrder"], ds.Tables["Answer"].Columns["QuestionOrder"]); //為兩個表建立關聯
Parent.DataSource = ds.Tables["Question"];//父DataList綁定源
Page.DataBind();//綁定
conn.Close();
注意:關于關聯的那行代碼的意思就如同 SQL語句里面的 INNER JOIN 查詢 就是把兩個表通過QuestionOrder 連接起來
在Question表里的QuestionOrder 與Answer表里的QuestionOrder一定要一一對應且是一對多關系就可以讓后者內容自動去排列在前者的相關內容后面就構成了上面最終的效果.
(上帝剛才罵了我,說我沒說清楚,那好把現在就給你們舉例說明一下!阿門!)
Question表里的QuestionOrder 假如有四種值