关于DataList嵌套DataList的问题(重点在于处理某些特殊结构与数据绑定)
2007-06-01 17:04
651 查看
最近公司要做一个客户展示系统:(类似调查问卷,并生成统计图)涉及到了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 假如有四种值 1,2,3,4
Answer表 里的QuestionOrder 就会有 N个1 N个2 N个3 N个4 但是绝对不会有其他的比如5,6等.
这样的话:
Question表 Answer表
QuestionOrder QUES QuestionOrder AN
1 你是上帝吗? 1 是上帝
2 你是好人吗? 1 不是上帝
3 你爱喝咖啡吗? 2 是好人
4 你爱写BLOG吗? 2 不是好人
3 爱喝
3 一般
3 不爱喝
4 爱写
4 不写
这样通过上面的方法后得到到的结果如下:
你是上帝吗?
是上帝
不是上帝
你是好人吗?
是好人
不是好人
你爱喝咖啡吗?
爱喝
一般
不爱喝
你爱写BLOG吗?
爱写
不写
自己仔细看看就明白了呵呵!
以上就是我的心得,目前做了1/3的功能,以后还要用JAVASCRIPT控制让答案能被鼠标拖动到指定区域,然后提交生成报表图(正在加油赶制中..)
下面是希望大家能跟我交流的内容:
一:上面我做的方法比较古老了 是1.1版本的做法:
<%@ 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>
大家可以看到<%# ((DataRowView)Container.DataItem).Row.GetChildRows("Myrelations") %>'与'<%# DataBinder.Eval(Container.DataItem, "[\"AnswerContent\"]")%>'
都是1.1的写法 ,哪位高手能给个2.0的写法???
二:听说还有其他方法 哪为高手还有其他更好的方法?请赐教!
另外我试图用
父DataList Child=(DataList)DataList.FindControl("子DataList");
Child.DataSource=ds //ds是数据源
但是我失败了 因为根本父DataList Child=(DataList)DataList.FindControl("子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 假如有四种值 1,2,3,4
Answer表 里的QuestionOrder 就会有 N个1 N个2 N个3 N个4 但是绝对不会有其他的比如5,6等.
这样的话:
Question表 Answer表
QuestionOrder QUES QuestionOrder AN
1 你是上帝吗? 1 是上帝
2 你是好人吗? 1 不是上帝
3 你爱喝咖啡吗? 2 是好人
4 你爱写BLOG吗? 2 不是好人
3 爱喝
3 一般
3 不爱喝
4 爱写
4 不写
这样通过上面的方法后得到到的结果如下:
你是上帝吗?
是上帝
不是上帝
你是好人吗?
是好人
不是好人
你爱喝咖啡吗?
爱喝
一般
不爱喝
你爱写BLOG吗?
爱写
不写
自己仔细看看就明白了呵呵!
以上就是我的心得,目前做了1/3的功能,以后还要用JAVASCRIPT控制让答案能被鼠标拖动到指定区域,然后提交生成报表图(正在加油赶制中..)
下面是希望大家能跟我交流的内容:
一:上面我做的方法比较古老了 是1.1版本的做法:
<%@ 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>
大家可以看到<%# ((DataRowView)Container.DataItem).Row.GetChildRows("Myrelations") %>'与'<%# DataBinder.Eval(Container.DataItem, "[\"AnswerContent\"]")%>'
都是1.1的写法 ,哪位高手能给个2.0的写法???
二:听说还有其他方法 哪为高手还有其他更好的方法?请赐教!
另外我试图用
父DataList Child=(DataList)DataList.FindControl("子DataList");
Child.DataSource=ds //ds是数据源
但是我失败了 因为根本父DataList Child=(DataList)DataList.FindControl("子DataList");
就是错的 找不到原因 希望赐教 也许通过找子DataList的这个方法也能解决,目前还没成功希望赐教.
实习生都加油 呵呵!
相关文章推荐
- datalist嵌套中子datalist数据绑定的处理
- 关于数据仓库数据质量的问题处理
- 关于http接口开发中json格式数据编码问题处理
- ioni3 http请求数据绑定时数组嵌套的显示问题
- BaseController处理表单数据绑定问题
- easyui datagrid 绑定从后台得到的复杂的特殊数据结构
- 关于处理PHP json_encode返回的json数据一些小问题
- 关于特殊字符的处理问题
- PTA 数据结构题目(1):最大子列和问题(分而治之、在线处理算法)
- mooc浙大数据结构PTA习题之最大子列和问题(在线处理)
- .NET/Visual Studio中DataList数据绑定后的分页处理
- MyGeneration学习笔记(8) :dOOdad提供的数据绑定、特殊函数和事务处理
- 关于ViewPager嵌套Fragment,第二次加载数据不显示问题
- 数据结构关于稀疏矩阵相加问题
- 关于SubSonic3.0插件使用实体进行更新操作时(执行T.Update()或T.Save()),某些列无法进行修改操作的问题处理
- 《ASP.NET1200例》嵌套在DataLisT控件中的其他服务器控件---DropDownList控件的数据绑定
- 关于c#中两个DataGrid绑定到主表和子表的数据同步问题
- 关于DataList的嵌套 和(ItemCommand)事件的问题
- 关于c#中双主键表数据如何绑定到DataTable的方法(针对于dataset.xsd的特殊情况)
- DataList 数据绑定,还有问题????