一棵树 Bom树

目前做一个制造业的ERP,要处理一个Bom,里面的阶数和节点数未知。
就是一棵复杂一点的客户端树(能与服务端交互),问了几个朋友,都爱莫能助,只好自己写了。
比较乱,不知道是否说清楚了,但愿能给你一点点的帮助。
一、环境 .net1.1 + javascript
二、关键字:树 Bom  Bom树 javascript树
三、主要功能:
1、框架是左边树右边内容,两边要可以交互,即点击左边节点右边要能显示内容,右边内容保存或删除或建子节点要即时的更新左边的树。
2、树是一层一层打开的,所有的树的HTML都是有代码生成,可以无限节点,无限阶数(当然速度有影响)。
3、第一次打开读数据库,第二次要显示的时候就不必读数据库,第二次显示只是改变visible。
四、主要代码
1、javascript部分(主树)  RemoteBigServer.js

None.gif /* ------------------------------------下面是树的操作---------------------------------------- */
None.gif
None.gif
var  m_MaginWith  =   14 ;
None.gif
var  m_ImageWith  =   9 ;
None.gif
var  m_UrlPkid  =   " BomContentMaterial.aspx?PKID= " ;
None.gif
var  m_UrlMat  =   " BomContentProduct.aspx?MaterialNo= " ;
None.gif
var  m_UrlRemote  =   " ../CommonPage/BomServer.asmx " ;
None.gif
var  m_ContentPre  =   " Content " ;
None.gif
var  m_ImgPre  =   " Img " ;
None.gif
var  m_ContentFormTag  =   " main " ;
None.gif
var  m_iamgeSpace  =   " ../Images/treeicon/space.gif " ;
None.gif
var  m_iamgeMinus  =   " ../Images/treeicon/minus.gif " ;
None.gif
var  m_iamgePlus  =   " ../Images/treeicon/plus.gif " ;
None.gif
None.gif
None.gif
None.gif
// other root use pkid as mark
None.gif//
e.g. :divPKID + pkid   ; content + pkid ; img + pkid
None.gif
function  OnTurnIt()
None.gif{
None.gif    
var  DivCurrent  =  event.srcElement.parentElement;    
None.gif    
if  (DivCurrent.tagName  ==  'TD')
None.gif        DivCurrent 
=  event.srcElement;
None.gif        
None.gif    
var  strPKID  =  DivCurrent.id.substring( 7 );    
None.gif    
None.gif    
var  objContent  =  document.getElementById(m_ContentPre  +  strPKID);
None.gif    
var  objDivContent  =  document.getElementById( " divContent "   +  strPKID);
None.gif    
var  objImage  =  document.getElementById(m_ImgPre  +  strPKID);
None.gif    
if  (objContent  ==   null )
None.gif    {
None.gif    
None.gif        
var  result  =  StartGetReomte(strPKID);
None.gif        
// if No Detail  Return  NoData 
None.gif
         var  divObj  =  document.getElementById( " divContent "   +  strPKID);
None.gif        
if  (result  ==   null   ||  result  ==   ""   ||  result  ==   " nodata "  )
None.gif        {
None.gif            
// if clear, has a space
None.gif
             // divObj.innerHTML = "";   
None.gif
             return  ;
None.gif        }
None.gif        
None.gif        
var  strHTML  =  CombineHTML(result,strPKID);        
None.gif        
None.gif        
None.gif        divObj.innerHTML 
=  strHTML;
None.gif            
None.gif    
//     DivCurrent.insertAdjacentHTML( "afterEnd", strHTML);  
None.gif
        
None.gif        objImage.src
=  m_iamgeMinus;
None.gif        
None.gif    }
None.gif    
else
None.gif    {
None.gif        
if  (objContent.style.display == " none "
None.gif        {
None.gif            objDivContent.style.display
= "" ;
None.gif            objContent.style.display
= "" ;
None.gif            objImage.src
=  m_iamgeMinus;
None.gif        }
None.gif        
else
None.gif        {
None.gif            objDivContent.style.display
= " none "
None.gif            objContent.style.display
= " none "
None.gif            objImage.src
=  m_iamgePlus;
None.gif        }
None.gif    }
None.gif}
None.gif
None.gif
function  StartGetReomte(strPKID)
None.gif{
None.gif    
var  SoapBody  =   " <strPKID> " +  strPKID  +   " </strPKID> " ;
None.gif    
var  MethodName  =   " GetBomDetailByPKID " ;
None.gif    
var  result  =  RemoteRun(m_UrlRemote, MethodName, SoapBody);
None.gif    
None.gif    
return  result;
None.gif}
None.gif
None.gif
None.gif
// Fill
None.gif
function  CombineHTML(result,strParentpkid)
None.gif{
None.gif    
var  strBlockHtml  =   "" ;
None.gif    
var  strExPrefix  =   " <table width='100%' border='0' id=' "   +  m_ContentPre  +  strParentpkid  +   " '><tr><td width=' " +  m_MaginWith 
None.gif                        
+   " '></td><td><table width='100%' border='0'> "                     
None.gif    
var  strExSuffix  =   " </table></td></tr></table> " ;
None.gif    
None.gif    
var  objRow  =  result.split(' | ');
None.gif    
if  (objRow.length  <=   0 )
None.gif    {
None.gif        
return ;
None.gif    }
None.gif            
None.gif    
for ( var  i  =   0  ;i  < objRow.length ; i ++ )
None.gif    {
None.gif        
if  (objRow[i]  ==   "" )
None.gif        {
None.gif            
continue ;
None.gif        }
None.gif        
None.gif        
var  objcolumn  =  objRow[i].split(',');
None.gif        
None.gif        
if  (objcolumn.length  !=   3 )
None.gif        {
None.gif            
continue ;
None.gif        }
None.gif        
None.gif        
// objRow Has Three Value: PKID ,MaterialNo    , HasChild
None.gif
         var  strDetailPKID         =  objcolumn[ 0 ];
None.gif        
var  MaterialNo             =  objcolumn[ 1 ];
None.gif        
var  hasChild             =  objcolumn[ 2 ];
None.gif        
None.gif        
var  imageSrc  =  m_iamgePlus;
None.gif        
if  (hasChild == 0 )
None.gif        {
None.gif            imageSrc 
=  m_iamgeSpace;
None.gif        }
None.gif                
None.gif        
var  contentPre  =   " <tr><td><div style='CURSOR: hand'id='divPKID " +  strDetailPKID  + " ' οnmοuseup=OnTurnIt();> " ;
None.gif        
var  contentSuf  =   " </div><div id='divContent "    +  strDetailPKID  +   " '></div></td></tr> "
None.gif        
None.gif        
var  content  =   " <IMG id=' "   +  m_ImgPre  +  strDetailPKID  +   " ' width= "   +  m_ImageWith  +   "  src=' "   +  imageSrc  +   " '><A href=' "   +  m_UrlPkid  +  strDetailPKID  +   " ' target=' "   +  m_ContentFormTag  +   " '> "   +  MaterialNo  +   " </A> " ;
None.gif
None.gif        strBlockHtml 
+=  contentPre  +  content  +  contentSuf;
None.gif        
None.gif    }
None.gif    
None.gif    
if  (strBlockHtml  !=   "" )
None.gif    {
None.gif        strBlockHtml 
=  strExPrefix  +  strBlockHtml  +  strExSuffix;
None.gif    }
None.gif    
None.gif    
return  strBlockHtml;
None.gif}
None.gif
None.gif
function  RemoteRun(page, Method, SoapBody)
None.gif{
None.gif    
var  url  =  page  +   " ?methodname= "   +  Method;
None.gif    
var  xmlhttp,dom,node,xmlDOC;
None.gif    
None.gif    
var  SoapHead  =   " <?xml version='1.0' encoding='utf-8'?> "   +
None.gif                    
" <soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body>< "   +  Method  +   "  xmlns='http://localhost'> " ;
None.gif    
var  SoapTail  =   " </ "   +  Method  +   " ></soap:Body></soap:Envelope> " ;
None.gif
None.gif    
var  SoapRequest  =  SoapHead  +  SoapBody  +  SoapTail;
None.gif    
None.gif    xmlhttp 
=   new  ActiveXObject( " Msxml2.XMLHTTP " );
None.gif    xmlhttp.Open(
" POST " ,url, false );
None.gif    xmlhttp.setRequestHeader(
" Content-Type " " text/xml;charset=utf-8 " );
None.gif    xmlhttp.setRequestHeader(
" SOAPAction " " http://localhost/ " + Method);
None.gif    xmlhttp.setRequestHeader(
" Content-Length " ,SoapRequest.length);
None.gif    xmlhttp.Send(SoapRequest);
None.gif    
None.gif    
if ( xmlhttp.Status  ==   200  )
None.gif    {
None.gif        
var  result  =  xmlhttp.responseXML.getElementsByTagName(Method  +   " Result " );
None.gif        
if (result)
None.gif        {
None.gif            
return  result( 0 ).text;
None.gif        }
None.gif    }
None.gif
None.gif    
return   " fail,check network! " ;
None.gif}
None.gif
// other root tree
None.gif/*
------------------------------------上面是树的操作---------------------------------------- */
None.gif
None.gif
None.gif
None.gif
// first root use materialno as mark
None.gif//
e.g. :div + materialNo   ; content + materialNo ; img + materialNo
None.gif
function  OnProductTurnIt()
None.gif{
None.gif    
var  DivCurrent  =  event.srcElement.parentElement;    
None.gif    
if  (DivCurrent.tagName  ==  'TD')   // 如果指向了上一级,就指回来
None.gif
        DivCurrent  =  event.srcElement;
None.gif        
None.gif    
var  strMaterialNo  =  DivCurrent.id.substring( 6 );    
None.gif    
var  strMatVersion  =  document.getElementById( " txtVersion " ).value;
None.gif    
None.gif    
if  (strMaterialNo  ==   "" )
None.gif        
return ;
None.gif    
None.gif    
var  objContent  =  document.getElementById(m_ContentPre  +  strMaterialNo);
None.gif    
var  objImage  =  document.getElementById(m_ImgPre  +  strMaterialNo);
None.gif    
if  (objContent  ==   null )
None.gif    {    
None.gif        
var  result  =  StartGetReomteByMat(strMaterialNo,strMatVersion);
None.gif        
// if No Detail  Return  NoData 
None.gif
        
None.gif        
var  divObj  =  document.getElementById( " divContent "   +  strMaterialNo);
None.gif        
if  (result  ==   null   ||  result  ==   ""   ||  result  ==   " nodata "  )
None.gif        {
None.gif            
// divObj.innerHTML = "";
None.gif
             return  ;
None.gif        }
None.gif        
/**/
None.gif        
None.gif        
var  strHTML  =  CombineHTML(result,strMaterialNo);    
None.gif        
None.gif        
None.gif        divObj.innerHTML 
=  strHTML;        
None.gif    
//     DivCurrent.insertAdjacentHTML( "afterEnd", strHTML);  
None.gif
        
None.gif        objImage.src
=  m_iamgeMinus;
None.gif        
None.gif    }
None.gif    
else
None.gif    {
None.gif        
if  (objContent.style.display == " none "
None.gif        {
None.gif            objContent.style.display
= "" ;
None.gif            objImage.src
=  m_iamgeMinus;
None.gif        }
None.gif        
else
None.gif        {
None.gif            objContent.style.display
= " none "
None.gif            objImage.src
=  m_iamgePlus;
None.gif        }
None.gif    }    
None.gif}
None.gif
None.gif
function  StartGetReomteByMat(strMaterialNo,strMatVersion)
None.gif{
None.gif    
var  sRet  =   "" ;
None.gif    
None.gif    
// if no version ,there is no info ,so return empty;
None.gif
     if  (strMatVersion  ==   "" )
None.gif        
return  sRet;
None.gif        
None.gif    
var  SoapBody  =   " <MaterialNo> " +  strMaterialNo  +   " </MaterialNo> "   +   " <MatVersion> " +  strMatVersion  +   " </MatVersion> "
None.gif
None.gif    
var  MethodName  =   " StartGetReomteByMat " ;
None.gif    sRet  
=  RemoteRun(m_UrlRemote, MethodName, SoapBody);
None.gif    
None.gif    
return  sRet;
None.gif}
None.gif
//  above is first root
None.gif/*
------------------------------------上面是树的操作---------------------------------------- */
None.gif
None.gif
None.gif
/* ------------------------------------下面是弹出窗口和查询的操作的操作---------------------------------------- */
None.gif
None.gif
var  Argobj;
None.gif
var  m_urlPopupMat  =  '.. / CommonPage / PopupGetMaterial.aspx ? MaterialNo = ';
None.gif
None.gif
None.gif
function  GetMatNoAndDoQuery()
None.gif{
None.gif    getMatAndVerFromPopUpWin();
None.gif        
None.gif    DoSetFirstRoot(Argobj.MaterialNo,Argobj.MatVersion);    
None.gif    
None.gif}
None.gif
None.gif
None.gif
function  getMatAndVerFromPopUpWin()
None.gif{    
None.gif    Argobj 
=   new  Object();
None.gif
None.gif    
var  txtmaterialno  =  document.getElementById( " txtMaterialNo " );
None.gif    
var  strMatNo  =  txtmaterialno.value;
None.gif    
None.gif    
var  sDlgPath  =  m_urlPopupMat  +  strMatNo ;
None.gif    
var  sFeatures  =  'dialogHeight: 400px; dialogWidth: 320px;scroll:no;help:No;edge:sunken; center:yes; status: No;';
None.gif
None.gif    window.showModalDialog(sDlgPath,Argobj,sFeatures);    
None.gif    
None.gif    
if  (Argobj  !=   null   &&  Argobj.MaterialNo  !=   null   &&  Argobj.MaterialNo  !=   "" )
None.gif    {
None.gif        document.getElementById(
" txtMaterialNo " ).value  = Argobj.MaterialNo;
None.gif        document.getElementById(
" txtVersion " ).value    = Argobj.MatVersion;
None.gif    }    
None.gif    
else
None.gif    {
None.gif        Argobj.MaterialNo 
=   "" ;
None.gif        Argobj.MatVersion 
=   "" ;
None.gif    }    
None.gif}
None.gif
None.gif
function  DoSetFirstRoot(strMaterialNo,strMatVersion)
None.gif{
None.gif    
if  (strMaterialNo  ==   "" )
None.gif    {
None.gif        
return ;
None.gif    }
None.gif    
None.gif    
var  txtproduct  =  document.getElementById( " txtproduct " );    
None.gif    
None.gif    
var  contentPre  =   " <div style='CURSOR: hand'id='divMat " +  strMaterialNo  + " ' οnmοuseup=OnProductTurnIt();> " ;
None.gif    
var  contentSuf  =   " </div><div id='divContent "   +  strMaterialNo  +   " '></div> " ;
None.gif    
var  content  =   " <IMG id=' "   +  m_ImgPre  +  strMaterialNo  +   " ' width= "   +  m_ImageWith  +   "  src=' "   +  m_iamgeSpace  +   " '><A href=' "   +  m_UrlMat  +  strMaterialNo    +   " &BomVersion= "   +   strMatVersion  +   " ' target=' "   +  m_ContentFormTag  +   " '> "   +  strMaterialNo  +   " </A> " ;
None.gif    
None.gif    
var  strProductHtml  =  contentPre  +  content  +  contentSuf;
None.gif        
None.gif    txtproduct.innerHTML 
=   strProductHtml;    
None.gif    
None.gif    
// update bomConent
None.gif
     // document.parentWindow.parent.frames.item(1).location.replace(m_UrlMat + strMaterialNo + "&BomVersion=" +  strMatVersion);
None.gif

None.gif}
None.gif
None.gif
/* ------------------------------------上面是弹出窗口和查询的操作的操作---------------------------------------- */
None.gif
None.gif
None.gif
None.gif
/* -----------------------------Begin-------敲回车的四种显示状态----------------Begin------------------------ */
None.gif
None.gif
// 4status , hasMaterialNo(show) ,Has1Bom(show) ,HasManyBom(popup), NoMaterialNo(popup)
None.gif

None.gif
function  MatKey13Down()
None.gif{
None.gif    
if (event.keyCode  !=   13 )
None.gif    {        
None.gif        
return ;
None.gif    }
None.gif    
None.gif    
var  txtMaterialNo  =  event.srcElement;    
None.gif    
var  strMaterialNo  =  txtMaterialNo.value;    
None.gif    
var  strMatVersion  =  getDefaultMatVersion(strMaterialNo);    
None.gif    
None.gif    
var  strRetValue  =  DoGetMatVersion(strMaterialNo);
None.gif    
if  (strRetValue  ==   "" )
None.gif    {
None.gif        GetMatNoAndDoQuery();
None.gif        
return ;
None.gif    }
None.gif    
None.gif    
var  iverCounts  =   - 1 ;
None.gif    
var  iMatCounts  =   - 1 ;
None.gif    
var  strRets  =  strRetValue.split(' | _ | ');
None.gif    
if  (strRets.length  >   1 )
None.gif    {
None.gif        iMatCounts 
=  strRets[ 0 ];
None.gif        iverCounts 
=  strRets[ 1 ];
None.gif        strMatVersion 
=  strRets[ 2 ];        
None.gif        
if  (strMatVersion  !=  '')
None.gif            document.getElementById(
" txtVersion " ).value  =  strMatVersion;
None.gif    }
None.gif    
None.gif    
//  NoMaterialNo(popup)
None.gif
     if  (iMatCounts  ==   0   ||  iverCounts  >   1 )
None.gif    {
None.gif        GetMatNoAndDoQuery();
None.gif    }
None.gif    
else   if  (iverCounts  ==   1 )
None.gif    {
None.gif        DoSetFirstRoot(strMaterialNo,strMatVersion);
None.gif    }
None.gif    
else   if  (iMatCounts  ==   1   &&  iverCounts  ==   0 )
None.gif    {
None.gif        strMatVersion 
=  document.getElementById( " txtVersion " ).value;
None.gif        DoSetFirstRoot(strMaterialNo,strMatVersion);        
None.gif    }
None.gif}
None.gif
None.gif
None.gif
// set Default MatVersion by script
None.gif
function  getDefaultMatVersion(strMaterialNo)
None.gif{
None.gif    
var  strMatVersion  =   "" ;
None.gif    
var  SoapBody  =   " <MaterialNo> " +  strMaterialNo  +   " </MaterialNo> " ;
None.gif    
None.gif    
var  MethodName  =   " getDefaultVersion " ;
None.gif    strMatVersion 
=  RemoteRun(m_UrlRemote, MethodName,SoapBody);
None.gif    
None.gif    document.getElementById(
" txtVersion " ).value  =  strMatVersion;
None.gif    
None.gif    
return  strMatVersion;
None.gif}
None.gif
None.gif
function  DoGetMatVersion(strMaterialNo)
None.gif{
None.gif    
var  sRet  =   "" ;
None.gif    
if  (strMaterialNo  ==   "" )
None.gif        
return  sRet;
None.gif        
None.gif    
var  SoapBody  =   " <MaterialNo> " +  strMaterialNo  +   " </MaterialNo> " ;
None.gif
None.gif    
var  MethodName  =   " getVersionByMat " ;
None.gif    sRet  
=  RemoteRun(m_UrlRemote, MethodName, SoapBody);
None.gif    
None.gif    
return  sRet;    
None.gif}
None.gif
None.gif
None.gif
/* -----------------------------End-------敲回车的四种显示状态----------------End------------------------ */
None.gif
None.gif
None.gif
/* ----------------Begin-------右边 保存后的调用函数--------Begin-------------------- */
None.gif
// other root use pkid as mark
None.gif//
e.g. :div + pkid   ; content + pkid ; img + pkid
None.gif
function  OnTurnItAuto(strPKID)
None.gif{
None.gif    
var  DivCurrent  =  document.getElementById('divPKID'  +  strPKID);
None.gif    
var  objContent  =  document.getElementById(m_ContentPre  +  strPKID);
None.gif    
var  objImage    =  document.getElementById(m_ImgPre  +  strPKID);
None.gif    
None.gif
None.gif    
var  result  =  StartGetReomte(strPKID);
None.gif    
// if No Detail  Return  NoData 
None.gif
     var  divObj  =  document.getElementById( " divContent "   +  strPKID);
None.gif    
if  (result  ==   null   ||  result  ==   ""   ||  result  ==   " nodata "  )
None.gif    {
None.gif        divObj.innerHTML 
=   "" ;
None.gif        
return  ;
None.gif    }
None.gif    
None.gif    
var  strHTML  =  CombineHTML(result,strPKID);            
None.gif    
None.gif    
None.gif    divObj.innerHTML 
=  strHTML;
None.gif    
None.gif    
None.gif    
// show
None.gif
     // divObj.style.display="";
None.gif
     // document.getElementById(m_ContentPre + strPKID).style.display="";
None.gif
    
None.gif    
// DivCurrent.insertAdjacentHTML( "afterEnd", strHTML);  
None.gif
    
None.gif    objImage.src
=  m_iamgeMinus;
None.gif
None.gif}
None.gif
None.gif
None.gif
// first root
None.gif
function  OnProductTurnItAuto(strMaterialNo)
None.gif{
None.gif    
if  (strMaterialNo  ==   "" )
None.gif        
return ;
None.gif
None.gif    
var  DivCurrent  =  document.getElementById('divMat'  +  strMaterialNo);        
None.gif    
var  strMatVersion  =  document.getElementById( " txtVersion " ).value;
None.gif    
None.gif    
None.gif    
var  objContent  =  document.getElementById(m_ContentPre  +  strMaterialNo);
None.gif    
var  objImage  =  document.getElementById(m_ImgPre  +  strMaterialNo);
None.gif
None.gif    
var  result  =  StartGetReomteByMat(strMaterialNo,strMatVersion);
None.gif    
// if No Detail  Return  NoData 
None.gif
    
None.gif    
var  divObj  =  document.getElementById( " divContent "   +  strMaterialNo);
None.gif    
if  (result  ==   null   ||  result  ==   ""   ||  result  ==   " nodata "  )
None.gif    {
None.gif        divObj.innerHTML 
=   "" ;
None.gif        
return  ;
None.gif    }
None.gif    
/**/
None.gif    
None.gif    
var  strHTML  =  CombineHTML(result,strMaterialNo);    
None.gif    
None.gif    
None.gif    
// show
None.gif
     // divObj.style.display="";
None.gif
     // document.getElementById(m_ContentPre + strMaterialNo).style.display="";
None.gif
    
None.gif    divObj.innerHTML 
=  strHTML;
None.gif            
None.gif
//     DivCurrent.insertAdjacentHTML( "afterEnd", strHTML);  
None.gif
    
None.gif    objImage.src
=  m_iamgeMinus;
None.gif
None.gif    
None.gif}
None.gif
None.gif
None.gif
function  FlushLeftByRightSave()
None.gif{
None.gif    
var  strRetValue  =  document.getElementById( " txtCurrenSaveValue " ).value;
None.gif    
None.gif    
var  strRes  =  strRetValue.split(' | _ | ');
None.gif    
None.gif    
if  (strRes.length  ==   2 )
None.gif    {
None.gif        
var  strValue   =  strRes[ 0 ];
None.gif        
var  status   =  strRes[ 1 ];
None.gif                
None.gif        
if  (status  ==   1 )   // 1 express first root
None.gif
        {
None.gif            OnProductTurnItAuto(strValue);
None.gif        }
None.gif        
else   if  (status  ==   2 )   // 2 exress >2 root
None.gif
        {
None.gif            OnTurnItAuto(strValue);        
None.gif        }        
None.gif    }            
None.gif}
None.gif
None.gif
/* ----------------End-------右边 保存后的调用函数--------End-------------------- */


2、WebService部分 BomServer.asmx

None.gif
None.gif        
private   int  GetChildCount( string  strMatNo,DataTable dtCount)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
int iret = 0;
InBlock.gif            
string strExp = string.Format(" FatherMat = '{0}' ",strMatNo);
InBlock.gif            DataRow[] drs 
= dtCount.Select(strExp);
InBlock.gif
InBlock.gif            
if (drs.Length > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                iret 
= (int)drs[0]["ChildCount"] ;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
return iret;
ExpandedBlockEnd.gif        }

None.gif
None.gif        [WebMethod]
None.gif        
public   string  StartGetReomteByMat( string  MaterialNo, string  MatVersion)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string strRet = "";
InBlock.gif
InBlock.gif            
string strSQLPKIDMat = string.Format(" Select PKID,MaterialNo FROM TBL_BomDetail Where FatherMat = \'{0}\' And ProductNo = \'{0}\'  And BomVersion = {1} And IsDelete = 0  ",MaterialNo,MatVersion);
InBlock.gif            
string strSQLHasChild = string.Format(" Select FatherMat,Count(*) As ChildCount FROM TBL_BomDetail Where FatherMat In ( Select MaterialNo FROM TBL_BomDetail Where FatherMat = \'{0}\' And ProductNo = \'{0}\'  And BomVersion = {1} And IsDelete = 0 ) And ProductNo = \'{0}\'  And BomVersion = {1} And IsDelete = 0 Group By FatherMat  ",MaterialNo,MatVersion);
InBlock.gif            
string strSQL = string.Format(" {0} ; {1} ",strSQLPKIDMat,strSQLHasChild);
InBlock.gif
InBlock.gif            DataSet ds 
=  DataProvider.RunSelect(strSQL);
InBlock.gif
InBlock.gif            
if (ds==null || ds.Tables.Count <= 1 || ds.Tables[0].Rows.Count ==0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
foreach(DataRow dr in ds.Tables[0].Rows)                               
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if (strRet.Trim() != "")
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        strRet 
+= "|";
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
string strPKID = dr["PKID"].ToString().Trim();
InBlock.gif                    
string strMatNo = dr["MaterialNo"].ToString().Trim();
InBlock.gif
InBlock.gif                    
int childCount = GetChildCount(strMatNo,ds.Tables[1]);
InBlock.gif
InBlock.gif                    strRet    
+= string.Format("{0},{1},{2}",strPKID,strMatNo,childCount);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
return strRet;
ExpandedBlockEnd.gif        }

None.gif
None.gif
None.gif        [WebMethod]
None.gif        
public   string  GetBomDetailByPKID( string  strPKID)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string strRet = "";
InBlock.gif
InBlock.gif            
string strConSQL = string.Format("  FatherMat In (Select MaterialNo FROM TBL_BomDetail  Where PKID =  {0}) And ProductNo In (Select ProductNo FROM TBL_BomDetail  Where PKID =  {0}) And  BomVersion In (Select BomVersion FROM TBL_BomDetail  Where PKID =  {0}) ",strPKID);
InBlock.gif            
string strSQLPKIDMat = string.Format(" Select PKID,MaterialNo FROM TBL_BomDetail Where IsDelete = 0  And  {0} ",strConSQL);
InBlock.gif
InBlock.gif            
string strHasChildCon = string.Format("  ProductNo In (Select ProductNo FROM TBL_BomDetail  Where PKID =  {0}) And  BomVersion In (Select BomVersion FROM TBL_BomDetail  Where PKID =  {0}) ",strPKID);
InBlock.gif            
string strHasChildConFatherMat = string.Format(" FatherMat In ( Select MaterialNo FROM TBL_BomDetail Where IsDelete = 0 And {0} ) ",strConSQL);
InBlock.gif            
string strSQLHasChild = string.Format("  Select FatherMat,Count(*) As ChildCount FROM TBL_BomDetail Where {0} And {1} And IsDelete = 0 Group By FatherMat  ",strHasChildConFatherMat,strHasChildCon);
InBlock.gif            
string strSQL = string.Format(" {0} ; {1} ",strSQLPKIDMat,strSQLHasChild);
InBlock.gif
InBlock.gif            DataSet ds 
=  DataProvider.RunSelect(strSQL);
InBlock.gif
InBlock.gif            
if (ds==null || ds.Tables.Count==0 || ds.Tables[0].Rows.Count ==0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
foreach(DataRow dr in ds.Tables[0].Rows)                               
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
if (strRet.Trim() != "")
ExpandedSubBlockStart.gifContractedSubBlock.gif                    
dot.gif{
InBlock.gif                        strRet 
+= "|";
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    
string strDetialPKID = dr["PKID"].ToString().Trim();
InBlock.gif                    
string strMatNo = dr["MaterialNo"].ToString().Trim();
InBlock.gif                    
int childCount = GetChildCount(strMatNo,ds.Tables[1]);
InBlock.gif                    strRet    
+= string.Format("{0},{1},{2}",strDetialPKID,strMatNo,childCount);
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
return strRet;
ExpandedBlockEnd.gif        }

None.gif
None.gif        [WebMethod]
None.gif        
public   string  getVersionByMat( string  MaterialNo)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string strRet = "";
InBlock.gif            
string strSQLMat = string.Format(" Select PKID FROM TBL_StockMaterial Where MaterialNo = \'{0}\'  ",MaterialNo);
InBlock.gif            
string strSQLBom = string.Format(" Select BomVersion FROM TBL_Bom Where MaterialNo = \'{0}\' And IsDelete = 0  ",MaterialNo);
InBlock.gif            
string strSQL = string.Format("{0} ; {1}  ",strSQLMat,strSQLBom);
InBlock.gif
InBlock.gif
InBlock.gif            DataSet ds 
=  DataProvider.RunSelect(strSQL);
InBlock.gif
InBlock.gif            
if (ds==null || ds.Tables.Count <= 1 || ds.Tables[0].Rows.Count ==0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
int iMatCount = ds.Tables[0].Rows.Count ;
InBlock.gif                
int iVerCount = ds.Tables[1].Rows.Count ;
InBlock.gif                
string strMatVersion  = "";
InBlock.gif                
if (ds.Tables[1].Rows.Count > 0)
InBlock.gif                    strMatVersion 
= ds.Tables[1].Rows[0]["BomVersion"].ToString();
InBlock.gif
InBlock.gif                strRet    
= string.Format("{0}|_|{1}|_|{2}",iMatCount,iVerCount,strMatVersion);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
return strRet;
ExpandedBlockEnd.gif        }

None.gif
None.gif
None.gif
None.gif        [WebMethod]
None.gif        
public   int  getDefaultVersion( string  MaterialNo)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
int retBomVersion = 0;
InBlock.gif            
int intCurMaxVersion = 0;
InBlock.gif            
string strSQL = string.Format(" Select Max(BomVersion) As MaxVersion FROM TBL_Bom Where MaterialNo = \'{0}\'  ",MaterialNo);
InBlock.gif            DataSet ds 
=  DataProvider.RunSelect(strSQL);
InBlock.gif
InBlock.gif            
if (ds==null || ds.Tables.Count <= 1 || ds.Tables[0].Rows.Count ==0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                    
if (!ds.Tables[0].Rows[0].IsNull("MaxVersion"))
InBlock.gif                        intCurMaxVersion 
= (int)ds.Tables[1].Rows[0]["BomVersion"];
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
string strYear = DateTime.Today.Year.ToString().Substring(2);
InBlock.gif            
string strMonth = DateTime.Today.Month.ToString("00");
InBlock.gif            
int iNewBomVer = Convert.ToInt32(strYear + strMonth + "00"); 
InBlock.gif
InBlock.gif            
if (iNewBomVer > intCurMaxVersion)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                retBomVersion 
= iNewBomVer;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
InBlock.gif                retBomVersion 
= intCurMaxVersion;
InBlock.gif
InBlock.gif
InBlock.gif            
return retBomVersion + 1;
ExpandedBlockEnd.gif        }

None.gif        
None.gif    


 3、右边保存或删除的交互部分
(1)子件物料的保存和删除通过此函数

None.gif          private   void  RegisterFlushLeftTree()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string strValue = "";
InBlock.gif            
if (H_ProductNo == H_FatherMat)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                strValue 
= string.Format("{0}|_|{1}",H_FatherMat,1);
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
int ipPkid = getParentPKID();
InBlock.gif                
if (ipPkid == 0)
InBlock.gif                    
return;
InBlock.gif
InBlock.gif                strValue 
= string.Format("{0}|_|{1}",ipPkid,2);
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
string strScript = string.Format("<Script Language = javascript>OnFlushLeftTree('{0}');</Script>",strValue);
InBlock.gif            Page.RegisterClientScriptBlock(Guid.NewGuid().ToString(),strScript);
InBlock.gif
ExpandedBlockEnd.gif        }

None.gif
None.gif        
private   int  getParentPKID()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
int iret = 0;
InBlock.gif            
string strSQL = string.Format(" Select PKID From TBL_BomDetail Where  IsDelete = 0  And  MaterialNo = '{0}' AND  ProductNo = '{1}' And BomVersion = '{2}' And BomLevel = '{3}' ",H_FatherMat,H_ProductNo,H_BomVersion,M_BomLevel-1);
InBlock.gif        
InBlock.gif            DataSet ds 
= DataProvider.RunSelect(strSQL);
InBlock.gif
InBlock.gif            
if (ds == null  || ds.Tables.Count == 0 || ds.Tables[0].Rows.Count == 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
ExpandedSubBlockEnd.gif            }

InBlock.gif            
else
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                iret 
= (int)ds.Tables[0].Rows[0][0];
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            
return iret;        
ExpandedBlockEnd.gif        }

对应Javascript
None.gif // now not completed
None.gif
function OnFlushLeftTree(strValue)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    var obj 
= document.parentWindow.parent.frames.item(0).document.getElementById('txtCurrenSaveValue');
InBlock.gif    obj.value 
= strValue;        
InBlock.gif    obj.click();
ExpandedBlockEnd.gif}

(2)父件删除和保存的
None.gif          private   void  SetLeftTreeBomVerSion( int  intBomVersion)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string strScript = string.Format("<script language=javascript>OnSetLeftBomVersion('{0}');</script>",intBomVersion);
InBlock.gif            Page.RegisterClientScriptBlock(
"SetLeftBomVersion",strScript);
ExpandedBlockEnd.gif        }

None.gif
None.gif
None.gif        
private   void  OnDelLeftTree()
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
string strScript = string.Format("<script language=javascript>OnDelTree();</script>");
InBlock.gif            Page.RegisterClientScriptBlock(
"OnDelLeftTree",strScript);
ExpandedBlockEnd.gif        }

对应Javascript
None.gif function OnSetLeftBomVersion(strBomVersion)
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    var obj 
= document.parentWindow.parent.frames.item(0).document.getElementById('txtVersion');
InBlock.gif    obj.value 
= strBomVersion;    
ExpandedBlockEnd.gif}

None.gif
None.gif
None.giffunction OnDelTree()
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif    var txtproduct 
= document.parentWindow.parent.frames.item(0).document.getElementById('txtproduct');
InBlock.gif    txtproduct.innerHTML 
=  '';    
ExpandedBlockEnd.gif}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 获取BOM(浏览器对象模型)的代码的实现方式有很多种,下面是一种常见的实现方式: ```javascript function getBomTree(node) { let tree = { name: node.nodeName, children: [] }; for (let i = 0; i < node.childNodes.length; i++) { let childNode = node.childNodes[i]; if (childNode.nodeType === 1) { // Element node tree.children.push(getBomTree(childNode)); } else if (childNode.nodeType === 3) { // Text node tree.children.push({ name: "TEXT", value: childNode.nodeValue }); } } return tree; } // 使用方法 let bomTree = getBomTree(document.documentElement); console.log(bomTree); ``` 上述代码中的`getBomTree`函数会遍历传入的节点及其子节点,创建一个包含节点信息的形结构。对于元素节点,会递归调用`getBomTree`函数;对于文本节点,会将节点值保存在`value`属性中。最后返回构建好的BOM。 调用`getBomTree`函数时,可以传入任意节点作为参数。一般情况下,可以将`document.documentElement`作为参数,它表示整个文档的根节点。获取到的`bomTree`对象将包含整个BOM的信息。 这只是一种实现方式,根据具体需求和使用场景的不同,可能需要对代码进行适当的修改和调整。 ### 回答2: 获取BOM的代码可以采用递归的方式遍历HTML文档,逐层获取每个节点的子节点,并将节点信息保存到一个列表中。 以下是一个示例代码: ``` def get_bom_tree(node): bom_tree = [] # 用于保存BOM的列表 children = node.childNodes # 获取当前节点的子节点列表 for child in children: if child.nodeType == child.ELEMENT_NODE: # 判断节点类型为元素节点 child_data = { 'tag': child.tagName, # 节点标签名 'attrs': dict(child.attributes.items()), # 节点属性 'children': get_bom_tree(child) # 递归获取子节点的BOM } bom_tree.append(child_data) return bom_tree # 示例用法 from xml.dom import minidom dom = minidom.parse('path/to/html/file') # 解析HTML文件 bom_tree = get_bom_tree(dom.documentElement) # 获取BOM # 打印BOM import json print(json.dumps(bom_tree, indent=4)) ``` 请注意,该代码使用了Python的内置库`xml.dom.minidom`来解析HTML文件,并递归获取BOM。在使用之前,需要安装`xml.dom`库,可以使用`pip install xml.dom`命令进行安装。 ### 回答3: 获取BOM(Browser Object Model)的代码可以通过JavaScript来实现。BOM是指代表浏览器窗口和窗口之间关系的状结构。在Web开发中,可以使用以下代码来获取BOM: ```javascript function getBomTree() { var currentWindow = window; // 获取当前窗口对象 var bomTree = { window: currentWindow, // 当前窗口对象为根节点 children: [] // 存储子窗口的数组 }; // 递归遍历子窗口 function traverseChildren(win, parentNode) { var iframes = win.document.getElementsByTagName('iframe'); // 获取当前窗口中的iframe元素 for (var i = 0; i < iframes.length; i++) { var iframeWindow = iframes[i].contentWindow; // 获取iframe窗口对象 var childNode = { window: iframeWindow, // 子窗口对象 children: [] // 存储子窗口的数组 }; parentNode.children.push(childNode); // 将子窗口节点添加到父节点的children数组中 traverseChildren(iframeWindow, childNode); // 递归遍历子窗口 } } traverseChildren(currentWindow, bomTree); // 调用递归函数遍历子窗口 return bomTree; } // 调用示例 var bomTree = getBomTree(); console.log(bomTree); ``` 以上代码通过递归函数`traverseChildren`来遍历子窗口,使用`getElementsByTagName`方法获取当前窗口中的所有`iframe`元素,然后获取其`contentWindow`属性来获取子窗口对象。通过递归调用,将所有子窗口对象存储在BOM中。最后通过`console.log`将BOM输出到控制台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值