实现技术:ajax

任务:对显示在页面上的不同数据源形成的模块编辑,能够进行添加,删除,修改等操作。

现在的数据模块是在页面上以表格的形式显示的,实现过程是在显示数据的页面上添加四个图标的onclick事件,分别为可编辑,添加一行,删除一行,保存修改。首先是在每行中加一列复选框,根椐选中的行进行数据的编辑,删除,修改,保存,实现的可编辑和删除的js方法如下:

function SetRowCanEdit_base(row)   
{      
 for (var i = 0 ; i < row.cells.length ; i ++)
 {   
        if(row.parentNode.rows[0].cells[i].getAttribute("CanEdit") == "true")
             row.cells[i].onclick = function() {  SetCellCanEdit_base(this);  } 
 }
}
function EditRow_base(table)//可编辑图片的onclick事件

    var d="";
 var fieldvalue="";
    for(var i=1;  i <table.rows.length  ;  i ++)
 {
    var chkOrder = table.rows[i].cells[0].firstChild;  
    if(chkOrder)
       {

            if(chkOrder.checked )
       {                
                        SetRowCanEdit_base(table.rows[i]);
                }      
         }
    }
}
//设置单元格可编辑

function SetCellCanEdit_base(element)
{   
  var textBox = document.createElement("input");
  textBox.type = "text";
  textBox.className="EditCell_TextBox";           //使用时,要根据具体的css来定
     if(element.getElementsByTagName('input').length >0)
             textBox.value =element.childNodes[0].value;
      else
              textBox.value = element.innerHTML;     

  textBox.onblur = function()
  {
    element.setAttribute("value",textBox.value);
    element.innerHTML = this.value;
  }
  element.innerHTML = "";       //清空单元格式
  element.appendChild(textBox);
  textBox.focus();
  textBox.select();
}
//删除行
function DeleteRow_base(table, id){
for(var i=table.rows.length - 1; i>0;i--){
   var chkOrder = table.rows[i].cells[0].firstChild;
   if(chkOrder){
    if(chkOrder.type = "CHECKBOX"){
     if(chkOrder.checked){
      //执行删除
     // table.deleteRow(i);
   deleterow(i,id);//需要获取行号和id参数,通过此函数操作数据库,进行行的删除。
   alert(i+id);
     }
    }
   }
}
}
function DeleteRow_sql(table, id){
for(var i=table.rows.length - 1; i>0;i--){
   var chkOrder = table.rows[i].cells[0].firstChild;
   if(chkOrder){
    if(chkOrder.type = "CHECKBOX"){
     if(chkOrder.checked){
      //执行删除
     // table.deleteRow(i);
   deletesqlrow(i,id);
     }
    }
   }
}
}
function CancelEditRow(checkbox)//对checkbox的onchange事件添加该函数,当checkbox取消时使得行处于不可编辑状态。
{      
     if(!checkbox.checked)
  {     
   var row = checkbox.parentNode.parentNode;
   for(var i = 1; i < row.cells.length ; i ++)
   {
    row.cells[i].onclick="";
   }
  }   
}

//添加行
function AddRow_base(table){
var newRow = table.insertRow(table.rows.length);
newRow.setAttribute("newRow","true");
var td;

 td  =newRow.insertCell();
 td.innerHTML="<input type=\"checkbox\" checked=\"checked\" onchange=\"javascript:CancelEditRow(this);\" />";

    for (var i = 1; i < table.rows[0].cells.length; i++) {
        td  =newRow.insertCell();
  td.innerHTML="newrow";+
 }

 SetRowCanEdit(newRow);
   return newRow; 
}

当对数据库中的数据进行修改后,需要进行保存。由于数据模块的获取是通过两种方式得到的,所以需要不同的保存方式。

下面是通过下拉列表形式得到的数据模块的保存函数sava_baserow.js

********************************************************************************

var xmlHttp_modifyrow;
var applicationRoot = "/MIS_Frame_0.20/jsp/";

function createXMLHttpRequestre_modifyrow()
{
 if(window.ActiveXObject)
 {
  xmlHttp_modifyrow=new ActiveXObject("Microsoft.XMLHTTP");
 }else if(window.XMLHttRequest)
 {
  xmlHttp_modifyrow=new XMLHttpRequest();
 }

function savebaserow(moduleid)
{   //首先从当前页面上获取需要的参数
     var table=document.getElementById(moduleid+"table");
    var databaseinstance =  document.getElementById(moduleid+"databaseinstance").value

    var databasename =  document.getElementById(moduleid+"databasename").value
   var tablename =  document.getElementById(moduleid+"tablename").value
   var columns = document.getElementById( moduleid+"columns").value;
   var  showpageobj = document.getElementById(moduleid + "showpage");
    var  showpage ;
     if(showpageobj)
    {
    showpage = document.getElementById(moduleid + "showpage").value;
   }
   else
     {
    showpage=1;
  }

//获取当前页页上被选中的行的行号和数据,将它们作为两个字符串传入到jsp中,一个字符串存所有选中的行的行号,另一个存所有选中行的数据,并将它们用分隔符区分下。
      var rowindex="";
   var fieldvalue="";
   var newfieldvalue="";
    for(var i=1;  i <table.rows.length  ;  i ++)
 {
    var chkOrder = table.rows[i].cells[0].firstChild;
    if(chkOrder)
       {

            if(chkOrder.checked )
       { 
           if(!table.rows[i].getAttribute("newRow"))
        {
       rowindex+=i;
       rowindex+="#";
       
       for (var j = 1; j < table.rows[0].cells.length-1; j++)
        {
          fieldvalue+=table.rows[i].cells[j].innerHTML;
          fieldvalue+=",";
         }   
        fieldvalue = fieldvalue + table.rows[i].cells[j].innerHTML + "#"
        }
        else
        { 
       for (var j = 1; j < table.rows[0].cells.length-1; j++)
        {
          newfieldvalue+=table.rows[i].cells[j].innerHTML;
          newfieldvalue+=",";
         }   
        newfieldvalue = newfieldvalue + table.rows[i].cells[j].innerHTML + "#"       
         
      }                            
                }
         }
    }

//如果判断行号不为空,则调用的是保存数据的页面(在原有数据的基础上修改而不是新增行的修改,因为新增行时没用到行号这个参数)
    if(rowindex!="")
 {
  createXMLHttpRequestre_modifyrow();
   xmlHttp_modifyrow.onreadystatechange =  new   Function("handleStateChangere_modifyrow(" + moduleid +")");
  xmlHttp_modifyrow.open("POST",applicationRoot+"modify_baserow.jsp",true);
  xmlHttp_modifyrow.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  xmlHttp_modifyrow.send("databaseinstance="+databaseinstance+"&databasename="+databasename+"&tablename="+tablename+"&columns="+columns+"&rowindex="+rowindex+"&fieldvalue="+fieldvalue+"&showpage="+showpage);
 //调用新加一行时数据保存的页面  
 if(newfieldvalue != "")
 {
  createXMLHttpRequestre_modifyrow();
  xmlHttp_modifyrow.onreadystatechange =  new   Function("handleStateChangere_modifyrow(" + moduleid +")");
  xmlHttp_modifyrow.open("POST",applicationRoot+"insert_baserow.jsp",true);
  xmlHttp_modifyrow.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
  xmlHttp_modifyrow.send("databaseinstance="+databaseinstance+"&databasename="+databasename+"&tablename="+tablename+"&columns="+columns + "&newfieldvalue="+newfieldvalue); 
}

 function handleStateChangere_modifyrow()
 {
  if(xmlHttp_modifyrow.readyState==4)
  {
   alert("okok");
      if(xmlHttp_modifyrow.status==200)
   {
            showbasedata(arguments[0]); //这里一定要加参数,否则多个模块之间的操作不能独立进行。
   }
   else{alert("wrong*wrong");} 
  }
 }