• Moving Rows in CListCtrl


    This article is very strightfoward but I thought it was a feature that most people could use in their own custom CListCtrls or CListViews.

    I had the need in one of my projects to allow the user to rearrange the order of the ListCtrl but I didn't want to allow them to drag and drop. Therefore I came up with this.

    代码
    BOOL CListCtrlEx::MoveRow(int from, int to)
    {
        
    //Can't move to the same place, or from or to a negative index
        if(from == to || from < 0 || to < 0)
            
    return FALSE;

        
    //First Copy the row to the new location
        if(CopyRow(from, to))
        {
            
    //If we have just inserted a row before
            
    //this one in the list, we need to increment
            
    //our index.
            if(from > to)
                DeleteItem(from 
    + 1);
            
    else
                DeleteItem(from);

            
    return TRUE;
        }
        
    else
            
    return FALSE;
    }

    BOOL CListCtrlEx::CopyRow(
    int from, int to)
    {    
        
    //Can't move to the same place, or from or to a negative index
        if(from == to || from < 0 || to < 0)
            
    return FALSE;

        
    //Copy the row to the new index
        InsertItem(to, GetItemText(from, 0));

        
    //If row has been inserted before original
        
    //increment the original
        if(from > to)
            from
    ++;

        
    //Loop through subitems
        for(int i = 1; i < GetColumnCount(); i++)
        {
            SetItemText(to, i, GetItemText(from, i));
        }

        
    return TRUE;
    }

    Remember that if you want to move a row one row upwards in the list you can use:

    m_List.MoveRow(index, index - 1);
    But to move it one row down you need:
    m_List.MoveRow(index, index + 2);

    This is because if you just enter 'index + 1' as the destination, the new row is inserted immeadiately after the current one. The current one is then deleted so you end up in the same place!

    Ahh... Trial and Error is a wonderful thing.

  • 相关阅读:
    (转)Android之内存泄漏调试学习与总结
    (转)linux下bluetooth编程(七)SDP协议
    (转)Linux下Bluez的编程实现
    (转)linux下bluetooth编程(八)SDP层编程
    (转)linux下bluetooth编程(二)blueZ协议栈
    (转)linux下bluetooth编程(六)L2CAP层编程实例
    (转)linux下bluetooth编程(五)bluetooth与socket
    (转)linux下bluetooth编程(四)L2CAP层编程
    (转)linux下bluetooth编程(一)基础概念
    (转)linux下bluetooth编程(三)HCI层编程
  • 原文地址:https://www.cnblogs.com/ciey/p/1787395.html
Copyright © 2020-2023  润新知