权限系统收获——将一个窗体上的多条数据在另一个窗体上显示
2014-04-16 23:30
330 查看
背景:
由于在一个页面上需要有多个不同的弹出框,如果我们将好几个弹出框都写在一个页面上的话,那页面岂不是热闹的很啊,不但看起来不顺眼吧,而且写的时候也很乱,所以我们想到将不同的弹出框写成一个窗体,点击按钮的时候弹出一个窗体
问题1:
想的挺好的,可是 一开始就遇到了问题,直接在本页面中弹出一个子窗体的时候样式不是很乐观,本来在网上查了例子,人家设置属性能控制弹出的窗体跟弹出框样式一模一样,可是我设置了之后一点变化都没有,随后我写了一些css修改了一下样式,可是还是很不乐观,后来高玮师哥给提供了一个思路,就是将弹出的窗体放在一个iframe控件上,这样的话样式就跟弹出框没什么区别啦.
解决方法:
解释:
src='ChangeOrganization.aspx?strData=<%=strJS%>' 是放到iframe中的窗体和需要传过去的数据
解释:
onclick="dialogOpen('updateOrganization', '950', '310');"为弹出窗体的方法,它是写在一个js的,updateOrganization为存放iframe的div的id,950为宽,310为高
问题2:
因为这次是实现批量修改的功能,所以弹出窗体时不能单纯的弹出一个空窗体,需要将选择的多条数据一齐在弹出的窗体上显示出来,这时候好需要获取选择的数据,当时我想到的方法就是通过onclick事件来获取选择的数据,接着麻烦就来了,要是这样的话我该怎么弹出窗体啊?那在后台写一个js代码喽
解决方法:
在后台往前台传js: Response.Write("<script language=javascript>dialogOpen('updateOrganization', '950', '310');</script>");前边我说过了,dialogOpen()这个方法是在dialogdemo2.js中写好的,所以往前台写js的时候还需要提前把引用写好了,写成如下:
问题3:
窗体弹出来了,选择的数据怎么也跟着过去呢?开始我想着根据复选框是否被选中,获取这一行中的其他数据,然后将所有选的行存放在一个datatable中,然后将这个datatable整个传到另一个页面,然后将这个datatable一下子就绑定到Repeater上了,想到到美,从后台往前台传json很方便,可是整个传datatable怎么传啊?哎,最后还是以json的格式传到前台的,然后再通过scr将它从前台传到另一页面上,这时候在另一个窗体加载的时候解析就哦了,
问题4:
由于Repeater上绑定的数据是以datatable的格式绑定的,所以json格式的数据是不合适的,怎么办?反序列化?怎么反啊?愁死我了,在网上查了很多json反序列化的方法,都没用上,最后找到一个人家自己写的反序列化方法,然后根据自己想要的,照着别人的方法修改了一个适合自己的反序列化方法。
解决方法:
问题5:
这样反序列化后的数据还不是我先要的,还需要根据其中一列数据查找其他的内容,并将它代替,呵呵,这个问题到没有难倒我
解决办法:
最后,将dt绑定到Repeater上,这次真的哦了
效果图:
![](http://img.blog.csdn.net/20140416232341328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2pyMTUyMzM2NjExNDM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
总结:
通过这个例子的实现,发现还有很多的知识对我来说很陌生,不怕大家笑话,这个例子用了我不到三天的时间,里边有一些逻辑确实挺恶心的,也许是我没有经历过的原因吧,下次肯定不会这样了,相信这给我更大的力量鼓励我更加努力的学习,加油!
由于在一个页面上需要有多个不同的弹出框,如果我们将好几个弹出框都写在一个页面上的话,那页面岂不是热闹的很啊,不但看起来不顺眼吧,而且写的时候也很乱,所以我们想到将不同的弹出框写成一个窗体,点击按钮的时候弹出一个窗体
问题1:
想的挺好的,可是 一开始就遇到了问题,直接在本页面中弹出一个子窗体的时候样式不是很乐观,本来在网上查了例子,人家设置属性能控制弹出的窗体跟弹出框样式一模一样,可是我设置了之后一点变化都没有,随后我写了一些css修改了一下样式,可是还是很不乐观,后来高玮师哥给提供了一个思路,就是将弹出的窗体放在一个iframe控件上,这样的话样式就跟弹出框没什么区别啦.
解决方法:
<%-- 先将此div隐藏,并将iframe控件放在其中 --%> <div id="updateOrganization" title="批量修改组织" style="display: none"> <iframe id="change" src='ChangeOrganization.aspx?strData=<%=strJS%>' frameborder="0" style="width: 920px; height: 300px"></iframe> </div>
解释:
src='ChangeOrganization.aspx?strData=<%=strJS%>' 是放到iframe中的窗体和需要传过去的数据
<%--再来写一个a,用来触发弹出窗体的事件--%> <a class="btn-lit" href="#" onclick="dialogOpen('addMoreChlidOrganization', '950', '310');"><span>批量修改组织</span></a>
解释:
onclick="dialogOpen('updateOrganization', '950', '310');"为弹出窗体的方法,它是写在一个js的,updateOrganization为存放iframe的div的id,950为宽,310为高
问题2:
因为这次是实现批量修改的功能,所以弹出窗体时不能单纯的弹出一个空窗体,需要将选择的多条数据一齐在弹出的窗体上显示出来,这时候好需要获取选择的数据,当时我想到的方法就是通过onclick事件来获取选择的数据,接着麻烦就来了,要是这样的话我该怎么弹出窗体啊?那在后台写一个js代码喽
解决方法:
在后台往前台传js: Response.Write("<script language=javascript>dialogOpen('updateOrganization', '950', '310');</script>");前边我说过了,dialogOpen()这个方法是在dialogdemo2.js中写好的,所以往前台写js的时候还需要提前把引用写好了,写成如下:
Response.Write("<script type='text/javascript' src='../js/dialogdemo2.js'></script>"); Response.Write("<script language=javascript>dialogOpen('updateOrganization', '950', '310');</script>");
问题3:
窗体弹出来了,选择的数据怎么也跟着过去呢?开始我想着根据复选框是否被选中,获取这一行中的其他数据,然后将所有选的行存放在一个datatable中,然后将这个datatable整个传到另一个页面,然后将这个datatable一下子就绑定到Repeater上了,想到到美,从后台往前台传json很方便,可是整个传datatable怎么传啊?哎,最后还是以json的格式传到前台的,然后再通过scr将它从前台传到另一页面上,这时候在另一个窗体加载的时候解析就哦了,
问题4:
由于Repeater上绑定的数据是以datatable的格式绑定的,所以json格式的数据是不合适的,怎么办?反序列化?怎么反啊?愁死我了,在网上查了很多json反序列化的方法,都没用上,最后找到一个人家自己写的反序列化方法,然后根据自己想要的,照着别人的方法修改了一个适合自己的反序列化方法。
解决方法:
string ParentId; strData = Request.QueryString["strData"].ToString(); string jsonStr = "{\"data\":" + strData + "}"; //将Json 字符串格式反序列话为datatable类型 JavaScriptSerializer jss = new JavaScriptSerializer(); //将指定的json字符串转换成对象图 var obj = jss.DeserializeObject(jsonStr); Dictionary<string, object> dic = (Dictionary<string, object>)obj; var data = dic["data"];//得到所有行的信息,数组类型,每一个数组是一个Dictionary类型的键值对,即为列 Array rows = (Array)data;//这里从rows 的每一个元素为一个Dictionary类的对象,相当于datatable中的一行的数据 DataTable dt = new DataTable(); foreach (Dictionary<string, object> cols in rows) { //为datatable添加列 if (dt.Columns.Count == 0) { foreach (string key in cols.Keys) { dt.Columns.Add(key); } } DataRow dr = dt.NewRow(); //为行中的每一列列赋值 foreach (string keyname in cols.Keys) { dr[keyname] = cols[keyname]; } dt.Rows.Add(dr); }
问题5:
这样反序列化后的数据还不是我先要的,还需要根据其中一列数据查找其他的内容,并将它代替,呵呵,这个问题到没有难倒我
解决办法:
//查找到的数据的条数 int num = dt.Rows.Count; string strTable = "T_Organization";//需要查询的数据库表 string strOrgName;//所属组织名称 //遍历每一行数据 for (int i = 0; i < num; i++) { //所属组织的id ParentId = dt.Rows[i][2].ToString().Trim(); //根据ParentId查找所属组织名称 StringBuilder strWhere = new StringBuilder(); strWhere.Append("Id='" + ParentId + "'"); if (publicBll.GetOrgInfo(strTable, strWhere.ToString()).Rows.Count != 0) { //所属组织名称 strOrgName = publicBll.GetOrgInfo(strTable, strWhere.ToString()).Rows[0][1].ToString().Trim(); //将所属组织名称代替ParentId dt.Rows[i][2] = strOrgName; } else { //将所属组织名称代替ParentId dt.Rows[i][2] = "无"; } }
最后,将dt绑定到Repeater上,这次真的哦了
//绑定数据 repUser.DataSource = dt; repUser.DataBind();
效果图:
总结:
通过这个例子的实现,发现还有很多的知识对我来说很陌生,不怕大家笑话,这个例子用了我不到三天的时间,里边有一些逻辑确实挺恶心的,也许是我没有经历过的原因吧,下次肯定不会这样了,相信这给我更大的力量鼓励我更加努力的学习,加油!
相关文章推荐
- vb.net 一个窗体在另一个窗体的容器内显示
- 当你使用close关闭一个窗体显示另一个窗体不管用的时候
- 双击dataGridView一行数据,打开一个另一个窗体,并把双击行的数据展示出来
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现大数据的高效分页显示
- 在该窗体上,放置一个按钮、一个标签。单击按钮时,在标签上显示当前系统时间。
- C#--第11周实验--任务1(建立Windows窗体应用程序)--设计一个窗体--单击按钮时,在标签上显示当前系统时间 .
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现大数据的高效分页显示
- [转载]两个Form,一个Form中处理数据,另一个是ShowDialog()出来的上面就一个progressBar用来显示进度!!
- 为什么在一个线程中不能调用显示另一个窗体?
- 设计一个如下图所示窗体:该窗体自动位于屏幕中央;大小不可调;最小化、最大化按钮不可用;窗体标题为“烟台大学”。在该窗体上,放置一个按钮、一个标签。单击按钮时,在标签上显示当前系统时间。
- 根据一个表的数据情况显示另一个表的数据
- 通用权限管理系统组件 (GPM - General Permissions Manager) 中实现大数据的高效分页显示
- 在一个窗体中调用另一个窗体的数据
- 编写一个生产者,消费者多线程程序,一个线程随机产生数据,另一个线程显示所产生的数据.
- C#--第11周实验--任务1(建立Windows窗体应用程序)--设计一个窗体--单击按钮时,在标签上显示当前系统时间
- javascript实现一个html提交的表单数据放到另一个html页面显示
- 在家看孩子,10分钟生成一个业务管理系统【能支持多数据库,大数据,流程审批,权限控制,即时提醒】,视频讲解详细实现步骤
- 在VS里创建Windows窗体,让其最小化在系统托盘,并显示一个Icon图标
- [转载]两个Form,一个Form中处理数据,另一个是ShowDialog()出来的上面就一个progressBar用来显示进度!!
- 两个窗体,一个显示完毕后,再显示另一个.