惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
Recent Announcements
Recent Announcements
L
LangChain Blog
B
Blog
阮一峰的网络日志
阮一峰的网络日志
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
M
MIT News - Artificial intelligence
D
Docker
WordPress大学
WordPress大学
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
博客园 - 叶小钗
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
有赞技术团队
有赞技术团队
MyScale Blog
MyScale Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
MongoDB | Blog
MongoDB | Blog
博客园 - Franky

博客园 - DarkAngel

好久未登陆 签到 Silverlight 3正式版新鲜出炉 Silverlight3的7个新功能[转] 读取DWG文件中的文本信息(CAD2004) 一个端口扫描的小程序 WEBPART结合实际的应用(.Net2005) 带验证功能的的TextBox 一个很老的故事: 水和鱼的故事 Browser.Net浏览器c#开发(开源) 吉祥三宝(设计篇) - DarkAngel - 博客园 将指定网页添加到收藏夹的方法(c#) Microsoft.Press.Microsoft.Visual.C.Sharp.2005.Step.by.Step.Oct.2005 取客户端MAC地址的方法 关于在活动目录(ACTIVE DIRECTORY)中创建组织单位和用户 Exchange 2k的安装与删除。 无 Cookie 的 ASP.NET 一个任意获得页面控件的方法 买不起笔记本,只好自己动手做一个啦-!(转)
跨页面的多选功能实现
DarkAngel · 2005-08-30 · via 博客园 - DarkAngel

这两天做了个人员选择的东西,觉得还有点意思,上来给大家砸一砸。先说说需求,就是要从部门人员的树中选择人或者部门,得到相关的ID来进行保存。考虑到很多页面都会用这个功能每个页面去做显然太傻就做成了个用户控件。如果把树放在控件中的话页面会很不美观而且很占页面控件(试想如果有几百个人员,树展开的话用户会想抽你的脸)。
  我是这样思考的将控件分成两个部门,用一个ListBox来显示选中了哪些人,用一个页面来显示树并进行选择操作。用户用控件的BUTTON打开选择页面进行选择,完成后关闭选择页面并把选择的值插入到LISTBOX里面,我的思路就是这样的,两个页面传值以前用JavaScript做过,觉得没太大问题,但是后来这个小问题还让我伤了下脑筋。至于怎么从树中取得值的问题我在这里就不说了。
首先是通过用户控件打开选择页面,因为后面我们要把值回写到用户控件的控件中,所以必须让打开的页面知道要对哪些控件进行操作,所以我把要操作的控件的ID做为一个参数传到要打开的页面。在用户控件中的控件显示到页面的时候他的实际ID会发生变化,所以在这里要用CLIENTID属性,不然无法正确获得控件的ID

在来说说打开后的选择页面。我把树中选中节点的名字和值分别用两个ARRAYLIST保存(当然他们对应的顺序是在保存时候控制的,不会出现不对应的问题)。然后用程序生成JAVASCRIPT。


这样就完成了我要的功能。但是实际操作的时候发现JAVASCRIPT报错,说错误操作方法。看了代码觉得没有什么问题,把生成的对LISTBOX进行赋值的代码插到控件的页面执行就是好的,但是在打开的子页面却出现错误,但是以前做过类似的程序如修改斧页面TEXTBOX的值都是行的通了。后来做了几个实验发现是Option对象的问题,我想可能是子页面的对象无法在父页面使用吧,我试成把代码改成

option=option+"opener.document.all."+Request.QueryString["par"].ToString()+".options["+o.ToString()+"]=opener.Option('"+alname[o].ToString()+"','"+al[o].ToString()+"');";

问题解决了,原来要用opener的Option对象才行(以前没遇到过这个问题,呵呵,太笨了)。当我以为这个功能已经完成的时候又发现一个致命的BUG,就是LISTBOX在有提交动作以后就变成初始状态了,里面的值无法保存,再次郁闷了,如果在提交以后LISTBOX初始化那对这个功能来说就没有任何意义了,不能获得值了不别人保存吧。只看不用?会被人砸的。试了很多方法,最后得出一个结论,用JAVASCRIPT填充的LISTBOX在提交过程中会回到初试状态。后来想了一个办法,加了一个隐藏域,当子页面反写的时候反写隐藏域(隐藏域在提交过程中里面的值是可以保存的),LISTBOX用来显示,隐藏域用来保存值。经过测试以后问题得到解决,这样前面打开窗口的代码要修改一下,要把隐藏域的ID也传到子页面,这样才能回写值。
  这还不算完,还要加一个小功能,就是在页面每次PAGE_LOAD的时候要检查隐藏域,如果不为空就要把值取出来对LISTBOX进行赋值,不然有提交动作的时候LISTBOX就又空了

功能到此就全部完成了,希望能给有同样问题的朋友一点启示。