MFC CListCtrl :: SetItemText()不起作用

时间:2016-02-10 10:56:41

标签: c++ visual-studio-2010 visual-c++ mfc

我是构建MFC应用程序的初学者。我刚刚开始使用列表控件(在报表视图中),我在更新列表时遇到了一些问题。我有三个按钮用于添加,更新和删除。除了更新之外,一切都运行良好。这是代码。

void CAddDetailsDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX); 
    DDX_Control(pDX, IDC_DEPARTMENT, departmentControl);
    DDX_Text(pDX, IDC_NAME, m_name);
    DDX_Text(pDX, IDC_ID, m_id);
    DDX_Text(pDX, IDC_AGE_BUDDY, m_ageVariable);
    DDX_CBString(pDX, IDC_DEPARTMENT, m_department);
    DDX_Control(pDX, IDC_LIST1, m_listControl);
}

BOOL CAddDetailsDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();
    // TODO:  Add extra initialization here 
    ageSpin=reinterpret_cast<CSpinButtonCtrl*>(GetDlgItem(IDC_AGE_SPIN));   
    ageBuddy=reinterpret_cast<CEdit*>(GetDlgItem(IDC_AGE_BUDDY));   
    ageSpin->SetBuddy((ageBuddy));
    ageSpin->SetRange32(18,60);     
    departmentControl.AddString("Human Resource");
    departmentControl.AddString("Manager");
    departmentControl.AddString("Administrator");
    departmentControl.AddString("Desktop Engineer");

    m_listControl.InsertColumn(0,"ID",0,100);
    m_listControl.InsertColumn(1,"Name",0,100);
    m_listControl.InsertColumn(2,"Age",0,60);
    m_listControl.InsertColumn(3,"Department",0,100);       
    m_listControl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );

    m_ageVariable="18";
    UpdateData(FALSE);

    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}
void CAddDetailsDlg::OnBnClickedEdit()
{
    // TODO: Add your control notification handler code here    
    UpdateData();
    if((m_id=="")||(m_name=="")||(m_department=="")||(m_ageVariable==""))
    {
        MessageBox("Please choose an item to edit","Error");
    }
    else
    {           
            int index=m_listControl.GetSelectionMark();
            m_listControl.SetItemText(index,0,m_id);
            m_listControl.SetItemText(index,1,m_name);
            m_listControl.SetItemText(index,2,m_ageVariable);
            m_listControl.SetItemText(index,3,m_department);            
            MessageBox("Successfully Updated","Info");       
    }       
}
void CAddDetailsDlg::OnBnClickedNewButton()
{
    // TODO: Add your control notification handler code here    
    UpdateData();
    if((m_id=="")||(m_name=="")||(m_department=="")||(m_ageVariable==""))
    {
        MessageBox("Please fill in all the details","Error");
    }
    else
    {       
        int count=m_listControl.GetItemCount();
        count=m_listControl.InsertItem(count,m_id);
        m_listControl.SetItemText(count,1,m_name);
        m_listControl.SetItemText(count,2,m_ageVariable);
        m_listControl.SetItemText(count,3,m_department);        
    }
}

注意: -

如果我只更新 ID ,更新功能可以正常工作。如果我尝试更新所有/多个文件,只会更新 ID 而不会更新。 BTW,age是一个spinControl,department是一个comboBox,另外两个是editBox。

修改: -

我发现变量m_name的值和editBox值都变为行m_listControl.SetItemText(index,0,m_id);之后的旧值。它与m_agem_department的情况相同。 如果我对该行m_listControl.SetItemText(index,0,m_id);发表评论,我可以一次更新所有内容,但 ID 除外。

我可以通过将m_namem_agem_department存储在行m_listControl.SetItemText(index,0,m_id);之前的局部变量中并使用{{1}中的这些变量来更新所有内容}。但是在我学习的过程中,我想知道自己哪里出错了。

5 个答案:

答案 0 :(得分:2)

我认为您忘记在Update_Bn_Click下的代码之前添加 UpdateData(),因为在我这边我使用您的代码与updatedata()及其工作正常。

UpdateData();
int index=m_List.GetSelectionMark();
m_List.SetItemText(index,0,m_id);
m_List.SetItemText(index,1,m_Name);
m_List.SetItemText(index,2,m_Age);
m_List.SetItemText(index,3,m_DepartMent);

答案 1 :(得分:1)

关闭排序。 在你的设计师: 属性&gt;行为&gt;排序设置为无。

答案 2 :(得分:0)

在更新项目后尝试抽取一些消息。

while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

答案 3 :(得分:0)

您必须先将Item添加到0 colomn index中。

<强> listcontrol-&GT; InsertItem(0,_T(&#34;文本&#34));

然后,您可以将文本设置为subItem;

<强> listctrol-&GT; SetItemText(0,1,_T(潜台词)):

答案 4 :(得分:-1)

首先,确保控件的Owner Data属性设置为FALSE。

也许在最后m_List.Update(index)后尝试SetItemText()

我必须承认,在我需要更新列表元素的任何地方,我都使用了所有者数据CListCtrl,因为我觉得在项目数量很多的情况下它会更快,并且从长远来看更容易处理。