将std :: map迭代对象存储为CGridCtrl

时间:2017-01-27 22:06:30

标签: mfc stdmap cgridctrl

我一直在努力决定如何传达我的问题。

我有一些地图:

typedef struct tagDemoEntryAssign
{
    COleDateTime datMeeting;
    CString      strAssignment;
    int          iAssignmentType; // AJT v16.0.9
    int          iStudyPoint;     // AJT v16.0.3
    int          iNextStudyPoint; // AJT v16.0.9
} S_DEMO_ENTRY_ASSIGN;

typedef std::vector<S_DEMO_ENTRY_ASSIGN> PublisherAssignments;

typedef struct tagDemoEntryEx
{
    CString     strName;
    E_GENDER    eGender;
    E_POSITION  ePosition;
    E_APPOINTED eAppointed;
    BOOL        bDemonstrations; // AJT v16.0.3

    PublisherAssignments  vectorItemAssign; // Sorted array of S_DEMO_ENTRY_ASSIGN structures.
} S_DEMO_ENTRY_EX;

typedef std::map<CString, S_DEMO_ENTRY_EX> PublisherMap;
typedef std::map<CString, S_DEMO_ENTRY_EX>::iterator PublisherMapIter;

我最终得到了一些数据,并填写了CGridCtrl。我尝试设置单元格的项目数据。具体做法是:

m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_NAME, (LPARAM)&iter->second);

当我尝试访问LPARAM数据时,它无效。

为什么?

更新

我认为问题与这行代码有关:

S_DEMO_ENTRY_ASSIGN sAssign = iter->second.vectorItemAssign.back();

我将其指定为项目数据:

m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_LAST_USED, (LPARAM)&sAssign);

随后在这里使用:

int CALLBACK CDemoPickerDlg::pfnCellCompareDate(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
    CGridCellBase* pCell1 = (CGridCellBase*)lParam1;
    CGridCellBase* pCell2 = (CGridCellBase*)lParam2;
    if (!pCell1 || !pCell2) return 0;

    S_DEMO_ENTRY_ASSIGN *psItem1 = (S_DEMO_ENTRY_ASSIGN*)pCell1->GetData();
    S_DEMO_ENTRY_ASSIGN *psItem2 = (S_DEMO_ENTRY_ASSIGN*)pCell2->GetData();

    // If a name has never been used the structure pointer will be null.
    if (psItem1 == NULL && psItem2 == NULL)
        return 0;
    else if (psItem1 == NULL)
        return -1;
    else if (psItem2 == NULL)
        return 1;
    else if (psItem1->datMeeting < psItem2->datMeeting)
        return -1;
    else if (psItem1->datMeeting == psItem2->datMeeting)
        return 0;
    else
        return 1;

}

我认为这是错误的:

S_DEMO_ENTRY_ASSIGN sAssign = iter->second.vectorItemAssign.back();

如果我理解正确的机制,上面的内容就是对结构进行复制。然后我分配这个副本的指针。并且副本超出了地图迭代循环的范围。

我需要存储一个指向实际iter->second.vectorItemAssign.back()对象的指针。

1 个答案:

答案 0 :(得分:0)

我不得不将一行代码更改为:

m_Grid.SetItemData(iRowCount - 1, DEMO_COLUMN_LAST_USED, (LPARAM)&iter->second.vectorItemAssign.back());