`
crabdave
  • 浏览: 1294938 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于ECSdie列表中隔页存值的问题(CheckBox_Select)

阅读更多

问题:在ECSide列表中,每行都有select标签,用户在第一页进行各行的select选择之后,执行页面翻页操作,翻到第二页,再回到第一页时不能回显原先对各行select标签所做的选择。同样还有对列表进行排序、修改每页显示行数等打乱现有列表排列的操作。

环境描述:
   1)在ECSide列表中,保存用户所选择的每行select值,在用户执行页面翻页、排序、修改每页显示行数后,
   仍能回显出原先用户所选的select值。在用户点击提交或保存操作后能将用户在不同页所选的值提交到后台。
   2)select值的形式:用户所选值_本行记录的ID,例如:OptionValue_132
   3)确保ECSdie列表所在页面在执行页面翻页、排序、修改每页显示行数等操作时,整个页面局部刷新(如果整个页面刷新将会清除后面将要提到的一个JavaScript全局变量)。
   4)关闭ECSide列表标签中的隔页存值属性(autoIncludeParameters),使用该属性虽然可以达到隔页存值的目的,但不能回显原先用户所做的选择,并且在每次在执行页面翻页、排序、修改每页显示行数等操作时,不停的在创建hidden标签。

解决方案:
   1)在用户点击select进行选值时,将其所选值存入一个作为全局变量的数组,并且在往该数组中存入用户所选值时,以该行记录的ID作为数组下标,将对应的值存入数组。在用户对select值进行修改时,取出该ID对应的数组下标的值,进行修改操作,若置回请选择时,根据该行记录的ID作为索引找到数组中对应的值,清空数组中的该值。
   2)用户在执行页面翻页、排序、修改每页显示行数后,取出当页所有select对象,将这些select对象与数组中的值进行匹配,如果有对应下标的值将其回显出来。回显的时候需要从ecside.js中抽象出一个JavaScript函数用于在执行页面翻页、排序、修改每页显示行数后执行。
   对ecside.js的修改如下:
     (1)翻页:在ECSideUtil.gotoPage方法中取到新页面的HTML时(即执行ecsideObj.ajaxSubmit()之后)。
     (2)排序:在ECSideUtil.doSort方法中取到新页面的HTML时(即执行ecsideObj.ajaxSubmit()之后)。
     (3)修改每页显示多行:在ECSideUtil.changeRowsDisplayed方法中取到新页面的HTML时(即执行ecsideObj.ajaxSubmit()之后)。
     在以上三个方法之后添加如下代码:
      try{
         //新的HMTL加载完后执行的函数   
         setAfterView();
      }catch(e){   
   
      }
     这样我们在每个开发的页面,直接写function setAfterView(){}函数就可以实现要回显的操作了。
   3)在用户点击“保存”或“提交”时,将数组中的值生成hidden连接到页面form中,提交到后台。
       var tempHid="";
       if(saveSelValues!=null&&saveSelValues.length>0){//如果数组中有值
           for(var i=parseInt(custIdTemp,10);i<saveSelValues.length;i++){
              if(saveSelValues[i]!=null){
           tempHid+="<input type='hidden' name='delIdTypeReas' value='" +i+"_"+saveSelValues[i]+ "'/>";//创建hidden标签,其中value值中的i(即数组的索引为每行记录的ID号)。
           }          
           }
           if(tempHid!=""){
           document.forms[0].insertAdjacentHTML("beforeEnd", tempHid);//将数组中的值生成hidden连接到页面form中
           }
       }
   4)在后台通过java的split("_")方法取出各ID所对应的用户所选值,之后再进行数据库操作。

备注:这种方式还适合于ECSide列表各中行的CheckBox、二级联动的select标签等的隔页存值问题。

参考实现:以下将以我在项目中开发的在ECSide列表中各行CheckBox和二级联动的select标签的隔页存值为例。
   描述:在EC列表中,第一列为CheckBox(进入列表页面默认都被选中),最后两列为一个二级联动的select标签(在CheckBox不被选中时,显示为可用,即默认为disabled)。
   代码如下:
    CheckBox:(第一列)
       <ec:column width="30" ellipsis="true" property="selectedCust" title="选择" sortable="false" >
  <input type="checkbox" value="该行记录的ID" onclick="abledSel(this)" checked="checked" typeId="该行记录的ID" name="delCustCheck"/>
       </ec:column>
    Select:(最后两列)
       <select name="delType" typeId="该行记录的ID"  disabled="disabled" id="firstSel_该行记录的ID" onchange="selSecondSel(this)">一级select菜单
            <option value='1' selected="selected">一级菜单1</option>
    <option value='2'>一级菜单2</option>
       <select name="delRes"  typeId="该行记录的ID" disabled="disabled" id="secondSel_该行记录的ID" onchange="saveSelValue(this)">二级select菜单
            <option value='1_1'selected="selected">二级菜单1</option>  其中1_1中的第一个1表示一级菜单1的value值,第二个1表示二级菜单1的value值
    <option value='1_2'>二级菜单2</option>

    准备select菜单数据:
         //准备一级菜单数据
var delType=new Array();

delType[0]=new Array();
delType[0].push('一级菜单1');
delType[0].push('1');

delType[1]=new Array();
delType[1].push('一级菜单2');
delType[1].push('2');

//准备二级菜单数据
var delReas=new Array();

delReas[0]=new Array();
delReas[0].push('二级菜单1');
delReas[0].push('1');
delReas[0].push('1'); //属于一级菜单1

delReas[1]=new Array();
delReas[1].push('二级菜单2');
delReas[1].push('2');
delReas[1].push('1');  //属于一级菜单1

delReas[2]=new Array();
delReas[2].push('二级菜单3');
delReas[2].push('3');
delReas[2].push('2');  //属于一级菜单2
      JavaScript函数:
//根据所选的一级菜单展示二级菜单
          function selSecondSel(firstSel){
//取出一级菜单选择的是哪一个
   var sel_Index = firstSel.selectedIndex;
var temp=firstSel.options[sel_Index].value;
var rowCode=firstSel.typeId;
//设置二级菜单
var sel_Obj_s=document.getElementById("secondSel_"+rowCode);
sel_Obj_s.innerHTML="";
var flag=true;
//alert(delReas.length);
for(var i=0;i<delReas.length;i++){
  if(delReas[i][2]==temp){
 
   var oOption = document.createElement("OPTION");
sel_Obj_s.options.add(oOption);
oOption.innerText = delReas[i][0];
oOption.value = delReas[i][2]+"_"+delReas[i][1];
if(flag){
      saveSelValues[rowCode]=delReas[i][2]+"_"+delReas[i][1];
  //  alert("4_saveSelValues["+rowCode+"]="+saveSelValues[rowCode]);
    flag=false;
}

}
}
}

//将客户列表的checkbox和select设置为可用
function enableCheckSel(){

   var dcc=document.getElementsByName("delCustCheck");
   if(dcc!=null&&dcc.length>0){
      for(var i=0;i<dcc.length;i++){
          dcc[i].disabled="";
      }
   }
   if(saveSelValues!=null&&saveSelValues.length>0){
   var temp=document.getElementsByTagName("select");
       for(var i=0;i<temp.length;i++){
       if(temp[i].typeId!=undefined&&temp[i]!=null){
       if(saveSelValues[temp[i].typeId]!=undefined&&saveSelValues[temp[i].typeId]!=null&&saveSelValues[temp[i].typeId]!=""){
       temp[i].disabled="";
       }
       }
       }
   }
}

//点击checkbox时执行
var custIdTemp=0;//记录用户所点选过的最小值
function abledSel(abledSel){  
    var as=abledSel.value;
    if(parseInt(custIdTemp,10)==0){
       custIdTemp=as;
    }
    if(parseInt(as,10)<parseInt(custIdTemp,10)){
    custIdTemp=as;
    }
    var ce=abledSel.checked
 
    var temp=new Array();
    temp[0]=document.getElementById("firstSel_"+as);
    temp[1]=document.getElementById("secondSel_"+as);
    if(temp.length>0){
       for(var i=0;i<temp.length;i++){ 
              var selRowCode=as;
              if(ce){//如果checkbox变为被选中,select标签不可用,清除数组中的存值
              temp[i].disabled="true";             
              saveSelValues[selRowCode]=null;            
              }else{//如果checkbox变为没有被选中,将对应的select标签设置为可用,在数组中添加相应的select值
             temp[i].disabled="";
             if(temp[i].id==("secondSel_"+selRowCode)){
             var sel_Index = temp[i].selectedIndex;
var temp1=temp[i].options[sel_Index].value;            
             saveSelValues[selRowCode]=temp1;        
             }
              }       
       }
    }
}
//保存用户所选value值的数组
var saveSelValues=new Array();
//保存用户所选的select值
function saveSelValue(sel_Obj){
//取出一级菜单选择的是哪一个
   var sel_Index = sel_Obj.selectedIndex;
   var temp=sel_Obj.options[sel_Index].value;
   var selRowCode=sel_Obj.typeId;
   saveSelValues[selRowCode]=temp;
}
//在列表执行页面翻页、排序、修改每页显示行数等操作后执行回显
function setAfterView(){
        if(saveSelValues!=null&&saveSelValues.length>0){
    var delCustCheck=document.getElementsByName("delCustCheck");
    for(var k=0;k<delCustCheck.length;k++){
    var i=delCustCheck[k].typeId;
        if(saveSelValues[i]!=null){
           var firstSel=document.getElementById("firstSel_"+i);
           var secondSel=document.getElementById("secondSel_"+i);
           if(firstSel==undefined||firstSel==null||secondSel==undefined||secondSel==null){
               continue;
           }
               delCustCheck[k].checked="";
           if(firstSel!=undefined&&firstSel!=null&&secondSel!=undefined&&secondSel!=null){
           var temp=saveSelValues[i].split("_");
           firstSel.disabled="";
           secondSel.disabled="";
           firstSel.value=temp[0];
           temp=saveSelValues[i];
           selSecondSel(firstSel);//执行该函数后会将该二级菜单的第一个选项存入数组,注意将原值保留,修改数组中的该值
           secondSel.value=temp;
           saveSelValues[i]=temp;
           }
        }
    }
    }
}

注意:JavaScript里数组的最大长度是: 4294967295,即2^32 - 1,数组的下标(即该行记录的ID)不要超过这个数。

补充:在实际开发过程中,有些记录的id是非常大的,好多都超过了10位数字,我想还是在列表中用rownumber做为每行记录的id来做数组的下标,这样即能保证每行记录有唯一的id,也能保证这个rownumber数字不会太大,毕竟在页面上显示的列表都是分页显示的,一般情况下再大能大到哪去呢?

以上仅为一个小小的参考实现,不过在效率上可能还有些欠缺,还有待优化,希望能启到抛砖引玉的作用。


      
  

















 

分享到:
评论

相关推荐

    struts2(checkbox_radio_select)表单标签的应用及详细事例

    本文将详细介绍Struts2中用于处理复选框(checkbox)、单选按钮(radio)以及下拉选择框(select)的表单标签,并通过具体的例子展示它们的用法。 ### 1. 表单标签Checkbox - 复选框 **复选框**允许用户从多个选项...

    mp_checkbox_捆绑_

    【标题】"mp_checkbox_捆绑_" 指的可能是一个软件或者工具,它与复选框(checkbox)功能有关,并且具有捆绑(bundling)特性。在IT领域,"捆绑"通常指的是将多个文件或应用程序集合在一起,形成一个单一的安装包或可...

    AllCheckBox_demo

    【标题】"AllCheckBox_demo" 是一个用于演示和练习如何在Android或Java环境中实现复选框(CheckBox)的多选和取消功能的示例项目。这个项目的核心目标是教会开发者如何处理CheckBox的选择状态,以便在实际应用中创建...

    C#_winform_GridView_CheckBox_多选_全选

    "C#_winform_GridView_CheckBox_多选_全选"这个主题就专门探讨了如何在WinForm的GridView中实现复选框的多选和全选功能。 首先,我们需要理解GridView的基本用法。GridView是.NET Framework中的System.Windows....

    html多选下拉框 ,CheckBox的Select组件 可多选的下拉框

    - **值的获取**:在提交表单时,我们可以通过遍历`&lt;select&gt;`中的`&lt;option&gt;`来获取用户选择的值。 3. **样式美化** 为了提供与传统下拉框相似的外观,可以使用CSS对`&lt;label&gt;`进行样式设置,如背景、边框、字体等。...

    checkbox_tree.zip_tree

    在这个`checkbox_tree.js`文件中,我们可以期待看到如何配置树面板、加载数据存储(store)、定义节点模型(model)、以及可能的事件监听器,用于处理复选框的改变和其他用户交互。 数据存储(store)通常会包含树...

    我改造的checkbox_dtree

    【标题】"我改造的checkbox_dtree"是一个关于前端开发的项目,主要涉及的是对一个名为"dtree"的JavaScript库进行了定制化改造,以增强其在多级选择中的功能。"dtree"通常用于创建可交互的树形数据结构,而这个改造版...

    gui.rar_checkbox_java gui

    在这个特定的程序实例中,标题"gui.rar_checkbox_java gui"暗示我们关注的是一个与Java图形用户界面(GUI)相关的项目,其中涉及到了`Checkbox`组件。描述中提到,程序包含了`TextField`、`TextArea`、`Checkbox`...

    check_frame.zip_GRoupBox_check box_checkbox_group box

    标题"check_frame.zip_GRoupBox_check box_checkbox_group box"提示我们将讨论如何用`CheckBox`来替代`GroupBox`的标题功能。 描述中提到"使用CheckBox代替Frame/GroupBox的标题",这是一种创新的设计方法,可以...

    vb6设置热键_visualbasic_checkbox_keycode_VB源码_combox_

    ComboBox则是一个下拉列表框,用户可以在输入框中直接输入或从下拉列表中选择一个选项。 在VB6中,热键的实现通常涉及到窗体的KeyDown事件和KeyPreview属性。KeyPreview属性设定为True时,窗体会先捕获所有按键事件...

    checkbox_css.zip

    在本项目中,"checkbox_css.zip" 是一个包含Python GUI应用的压缩包,该应用用于演示如何使用PyQt5库来改变Checkbox(复选框)的样式。PyQt5是Python的一个强大的图形用户界面(GUI)框架,它实现了Qt库的功能,而Qt...

    ListView-TreeView-CheckBox.rar_C# treeview_listview checkbox_tre

    在这个项目中,"ListView-TreeView-CheckBox.rar"提供了一个结合`ListView`、`TreeView`以及CheckBox功能的实现,这在数据管理和用户交互中非常常见。下面将详细解释这些控件以及如何通过C#编程实现它们的组合。 **...

    customfield_checkbox_utility

    git clone到Redmine路径上的plugins/customfield_checkbox_utility 。 $ cd {RAILS_ROOT}/plugins $ git clone https://github.com/preciousplum/customfield_checkbox_utility 重新启动Redmine。 现在,您应该...

    jquery操作Radio、Checkbox、Select Demo

    本教程将深入探讨如何使用jQuery来操作HTML中的Radio按钮、Checkbox复选框以及Select下拉列表。 一、jQuery操作Radio按钮 Radio按钮通常用于提供一组互斥的选择,用户只能选择其中一个。在jQuery中,我们可以使用`...

    checkBox selectAll

    在IT行业中,`checkBox` 和 `selectAll` 是两个常见的概念,尤其在前端开发领域。`checkBox` 是一种用户界面元素,通常称为复选框,它允许用户从多个选项中选择一个或多个。而 `selectAll` 功能则常用于提供一个快捷...

    jquery获取各种radio,checkbox,select的值等

    - `var maxIndex=$("#select_id option:last").attr("index")`:获取select中最后一项的索引值。 2. **jQuery设置Select的选中项**: - `$("#select_id").get(0).selectedIndex=1`:将选中项设置为索引值为1的...

    C#中获取CheckBox选中值(多选)

    本文将深入探讨如何在C#中有效且简洁地获取多个CheckBox控件的选中值,这对于构建响应式和用户友好的应用程序至关重要。 ### 一、理解CheckBox控件 CheckBox控件是一种允许用户进行二元选择(即“是”或“否”,...

    怎么获取checkbox/select/radio、选择中的text和value值

    $("#checkbox_id").attr("checked", true); ``` 这些语句用于控制`&lt;input type="checkbox"&gt;`的选中状态。 ### 总结 通过jQuery的强大选择器和DOM操作功能,开发者可以轻松地读取和修改HTML表单元素的状态。无论是...

    jquery 获得select、radio、checkbox选择的text和value值

    在网页开发中,`&lt;select&gt;` 标签用于创建下拉列表,通常用于用户输入时的选择操作。jQuery 提供了简单且强大的方法来处理 `&lt;select&gt;` 元素。 ##### 1. 获取选中项的 value 值 ```javascript // 获取名为 "month" 的...

    LazyForm radio,checkbox,select样式自定义

    在IT行业中,前端开发是至关重要的一环,而表单元素如radio、checkbox和select的样式定制则是提升用户体验和界面美观度的关键。"LazyForm radio,checkbox,select样式自定义"是一个针对这一需求的解决方案,它基于...

Global site tag (gtag.js) - Google Analytics