最近公司要做一個客戶展示系統(tǒng):(類似調(diào)查問卷,并生成統(tǒng)計圖)涉及到了DataList嵌套DataList的問題,現(xiàn)在把自己的心得公布希望多多交流并且也在尋找更加簡單合適的方法!
用DataList嵌套DataList的意義 無非是想構(gòu)造 類似樹型結(jié)構(gòu)的展示功能(N大主題包括N小主題,每個大主題內(nèi)嵌小主題)
比如我這次的項目是一個調(diào)查項目:要求結(jié)果是:
| 你喝過咖啡嗎?
|
| 你喜歡喝咖啡嗎?
|
| 您的月薪?
|
| 您的學(xué)歷?
|
其中紅色內(nèi)容是題目,綠色內(nèi)容是回答內(nèi)容,由于數(shù)據(jù)庫設(shè)計時候一定會把問題和答案分開,且一個問題多個答案選擇(一對多關(guān)系),所以問題和答案
會在不同的表內(nèi)且用一條語句無法實現(xiàn)按照此結(jié)構(gòu)的順序結(jié)構(gòu)(也就是用一個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的數(shù)據(jù)源綁定 "Myrelations"為問題與選擇答案表的關(guān)系名稱(關(guān)于這個關(guān)系名稱的由來下面的代碼中將介紹)
后臺代碼:
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"]); //為兩個表建立關(guān)聯(lián)
Parent.DataSource = ds.Tables["Question"];//父DataList綁定源
Page.DataBind();//綁定
conn.Close();
注意:關(guān)于關(guān)聯(lián)的那行代碼的意思就如同 SQL語句里面的 INNER JOIN 查詢 就是把兩個表通過QuestionOrder 連接起來
在Question表里的QuestionOrder 與Answer表里的QuestionOrder一定要一一對應(yīng)且是一對多關(guān)系就可以讓后者內(nèi)容自動去排列在前者的相關(guān)內(nèi)容后面就構(gòu)成了上面最終的效果.
(上帝剛才罵了我,說我沒說清楚,那好把現(xiàn)在就給你們舉例說明一下!阿門!)
Question表里的QuestionOrder 假如有四種值