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

Page.RegisterClientScriptBlock("open",@"
<script language=javascript>

function openWin( )
{
var newwin=window.open('selectUser.aspx?par="+lbuser.ClientID+@"','selectUser','width=200,height=200');
newwin.opener=this.window;;
                                                             }</script>");
btShow.Attributes.Add("onclick","openWin();");

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

string option="";
            
            for(int o=0;o<al.Count;o++)
            {
            option=option+"opener.document.all."+Request.QueryString["par"].ToString()+".options["+o.ToString()+"]=new  Option('"+alname[o].ToString()+"','"+al[o].ToString()+"');";
            
            }
   string scr=@"
<script language=javascript>
"+option+@"

window.close();
</script>";
        
            Response.Write(scr);


这样就完成了我要的功能。但是实际操作的时候发现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就又空了

lbuser.Items.Clear();
            if (!tbValue.Value.Equals(""))
            {
                string[] vv=tbValue.Value.Split(';');
                for (int i=0;i<vv.Length;i++)
                {
                    if(vv[i].Equals(""))continue;
                    string[] nv=vv[i].Split(',');
                    ListItem li=new ListItem(nv[0],nv[1]);
                    lbuser.Items.Add(li);
                }

            }

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

转载于:https://www.cnblogs.com/DarkAngel/archive/2005/08/30/225965.html

跨页面的多选功能实现相关推荐

  1. 在ASP.NET中跨页面实现多选

    作者:孟宪会 微软MVP SelectMultiPages.aspx <%@ Page EnableViewState="true" CodeBehind="Sel ...

  2. Vue3 - Element plus 实现 “带分页“ 表格组件,实现跨页进行 “分页勾选“ 的多选功能(解决分页表格组件 <el-table> 跨页后已前勾选的行自动消失问题)详细示例解决教程

    前言 在 Vue3 项目中,使用 Element Plus 组件库的表格组件时,出现了跨页勾选复选框消失的问题. 本文实现了 vue3 中 element plus 表格组件 <el-table ...

  3. php中在页面显示多选的内容,在html页面的表单选项中如何能有多选功能?(示例)...

    在上篇文章[html页面中的单选框功能是怎么操作实现的?(示例)]中,我为大家详细介绍了如何实现html页面中单选框功能,那边本篇文章继续给大家介绍关于html复选框怎么设置即html多选按钮的相关知 ...

  4. 如何在vue项目中,跨页面(跨路由)使用新手引导工具 Intro.js

    文章目录 功能要求 使用Intro.js遇到的问题以及代码 1.不能跨路由 utils -> intro.js 2.要在页面引导所需显示的数据全部拿到且渲染完毕以后加载Intro.js intr ...

  5. 面试官:前端跨页面通信,你知道哪些方法?

    引言 在浏览器中,我们可以同时打开多个Tab页,每个Tab页可以粗略理解为一个"独立"的运行环境,即使是全局对象也不会在多个Tab间共享.然而有些时候,我们希望能在这些" ...

  6. URL、Session、Cookies、Server.Transfer、Application和跨页面传送。

    URL.Session.Cookies.Server.Transfer.Application和跨页面传送. [分析] 本题考查面试者对ASP.NET中多页面传值的理解是否全面.因为ASP.NET的页 ...

  7. php 微信小程序 循环 多选,微信小程序实现多选功能

    本文为大家分享了微信小程序实现多选功能的具体代码,供大家参考,具体内容如下 代码: {{num + 1}}/{{quesyion.length}}{{question[num][0]}} A {{qu ...

  8. java按钮触发另一个页面_前端跨页面通信,你知道哪些方法?

    戳蓝字「前端技术优选」关注我们哦! 引言 在浏览器中,我们可以同时打开多个Tab页,每个Tab页可以粗略理解为一个"独立"的运行环境,即使是全局对象也不会在多个Tab间共享.然而有 ...

  9. 点击编辑框全选内容java_Android 中使用EditText 点击全选再次点击取消全选功能

    最近在开发浏览器碰到这么一个需求:点击地址栏的时候,需要全选并调出键盘,再次点击就取消全选显示光标.点击屏幕除地址栏其他位置时,键盘隐藏,隐藏光标. 大部分浏览器都是这样的逻辑,这样可以提高用户体验, ...

  10. 两个html页面之间通讯,面试官:前端跨页面通信,你知道哪些方法?

    引言 在浏览器中,我们可以同时打开多个Tab页,每个Tab页可以粗略理解为一个"独立"的运行环境,即使是全局对象也不会在多个Tab间共享.然而有些时候,我们希望能在这些" ...

最新文章

  1. XHTML+CSS3(Chapter 1)
  2. linux mysql编译安装mysql_【MySQL安装】Linux下安装MySQL(预编译)
  3. 登錄CentOS出現-bash-4.1#
  4. python学习-syspath、系统内置模块
  5. [转载] Java中日期格式转换
  6. python初级第三库(人工智能,web解析,人机交互)
  7. 基于神念TGAM的脑波小车(1)
  8. c++题目大坑:分数化小数
  9. Web App:赌的就是互联网未来并 非无可挑剔
  10. PIX525-IPSEC-×××配置
  11. 第二季-专题15-快车道DMA
  12. Eclipse 反编译插件下载地址
  13. 【工具】telnet用法
  14. 0的ascii码值(0的ascii码值)
  15. cc2430 外部中断
  16. matlab剪切板中内容清除,清除剪贴板的内容
  17. 使用python批量解压7z格式压缩包
  18. 删除播放器上的Flowplayer图标
  19. Launcher3如何实现主菜单背景的透明度调整
  20. 鱼雷导引仿真matlab

热门文章

  1. python灰色关联度分析_基于灰色关联度重庆万州区边坡稳定影响因素分析
  2. matlab 光斑质心算法,高精度光斑中心定位算法
  3. 用计算机探索规律反思,规律的背后——用计算器探索规律教学反思
  4. (4层)域名系统 DNS
  5. Excel中判断内容是否重复-条件格式或IF+COUNTIF函数
  6. Box2D引擎实现割绳子物理部分的方法
  7. HTML做一个简单的页面(纯html代码)地球专题学习网站
  8. 【干货】大数据招聘官就业指导
  9. 没有CUE的情况下APE刻录CD
  10. VB6下如何获得硬盘序列号