♣ Tech & Biz Salon/Tech

Miplatform TreeView에서 자식(자손)여부 파악 및 체크박스 제어

TasteGod 2010. 3. 10. 20:52

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

/****************************************************************************************************
2010-03-10 jeeta
기능 : 임의건 체크박스 컨트롤시에 해당건의 자손들에 대해서 임의건의 체크박스 값을 따르도록 한다

        ( 즉, 부모의 체크박스값을 자손들에게도 적용한다는 것이다 )
설명 : 체크컬럼아이디, 레벨컬럼아이디 값을 할당후, 2개의 펑션을 통해 수행됨
         체크박스를 제어하지 않고, 부모 여부만을 파악할때에는 아래의 내용을 조금 수정해서 사용가능함
****************************************************************************************************/

var chkColId = "MAPP_YNNO";
var lvlColId = "MENU_LVL";

// Treeview BindDataset 값 변경시 호출된다
function dsMenuTree_OnColumnChanged(obj,nRow,strColumnID,varOldValue,varNewValue,nPivotIndex)
{
    var dsObj = obj;
    var trvObj = trvMenu;
    
    
    // checkbox col 일때에만 수행.
    if( strColumnID == chkColId )
    {
        //trace( "varOldValue/varNewValue:" + varOldValue + "/" + varNewValue );
        var selRow = nRow;
        var selLvl = dsObj.GetColumn(nRow, lvlColId);
        var selVal = dsObj.GetColumn(nRow, chkColId);
        
        //trace("selRow / selLvl " + selRow + "/" + selLvl );
        
        // 하위 인덱스건에 대해서만 루프를 돌면 된다.
        for( i = selRow+1; i < dsObj.GetTotalRowCount(); i++)
        {
            nowLvl = dsObj.GetColumn(i, lvlColId);
            
            //레벨이 똑같은 건이 나왔는데, select 한 selRow건이 아니라면 break 하면 된다.(selRow 건의 자매로 상황 바뀌었으므로 )
            if( nowLvl == selLvl && i != selRow )
            {
                break;
            }
            
            //부모레벨보다 레벨값이 클때만 체크한다
            if( ToInteger(nowLvl) > ToInteger (selLvl) )
            {
                // 최종적으로 원하는 경우를 찾아낸다
                if( fnIsTreeAboveIdx(dsObj, trvObj, i, nowLvl, selRow, selLvl) )
                {
                    dsObj.FireEvent = false;
                    dsObj.SetColumn(i, chkColId, selVal);
                    dsObj.FireEvent = true;
                }
            }
        }
    }
}

// 특정건(nowIdx) 이 특정건(aboveIdx) 의 자손인지 파악한다.
function fnIsTreeAboveIdx( dsObj, trvObj, nowIdx, nowLvl, aboveIdx, aboveLvl)
{
    var rVal = false;
    var lpParentRow;
    var lpParentLvl;
    var chkIdx;
    
    //trace("nowIdx:" + nowIdx );

    //lpParentRow 의 레벨이 aboveLvl 보다 적다면, aboveLvl 과 같게 될때까지 파악해야 한다
    var loopStop = false;

    chkIdx = nowIdx;

    while( loopStop == false )
    {
        
        lpParentRow = trvObj.GetParentRow(chkIdx);
        lpParentLvl = dsObj.GetColumn(lpParentRow, lvlColId);
        
        //trace("lpParentRow:" + lpParentRow );
        //trace("lpParentLvl:" + lpParentLvl );
        
        if( lpParentRow == aboveIdx )
        {
            loopStop = true;
            return true;
        }
        else
        {
            if( ToInteger(lpParentLvl) <= ToInteger(aboveLvl) )
            {
                loopStop = true;
            }
            else
            {
                loopStop = false;
            }
        }
        
        chkIdx = ToInteger(lpParentRow);
    }

    return rVal;

}

//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ <<

이 글은 스프링노트에서 작성되었습니다.