C++ MFC CListCtrl::SetItemText()不工作

C++ MFC CListCtrl::SetItemText()不工作,c++,visual-studio-2010,visual-c++,mfc,C++,Visual Studio 2010,Visual C++,Mfc,我是构建MFC应用程序的初学者。我刚刚开始使用列表控件(在报表视图中),在更新列表时遇到了一些问题。我有三个按钮用于添加、更新和删除。除了更新之外,一切都很好。这是密码 void CAddDetailsDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_DEPARTMENT, departmentControl); DDX_Text(

我是构建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);        
    }
}
void CAddDetailsDlg::DoDataExchange(CDATA交换*pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_控制(pDX、IDC_部门、部门控制);
DDX_文本(pDX、IDC_名称、m_名称);
DDX_文本(pDX、IDC_ID、m_ID);
DDX_文本(pDX、IDC_年龄_伙伴、m_年龄变量);
DDX_CBString(pDX、IDC_部门、m_部门);
DDX_控件(pDX、IDC_列表1、m_列表控件);
}
BOOL cadddeilsdlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
//TODO:在此处添加额外的初始化
ageSpin=重新解释演员阵容(GetDlgItem(IDC年龄旋转));
ageBuddy=reinterpret_cast(GetDlgItem(IDC_AGE_BUDDY));
ageSpin->SetBuddy((ageBuddy));
ageSpin->SetRange32(18,60);
departmentControl.AddString(“人力资源”);
departmentControl.AddString(“经理”);
departmentControl.AddString(“管理员”);
departmentControl.AddString(“桌面工程师”);
m_listControl.InsertColumn(0,“ID”,0100);
m_listControl.InsertColumn(1,“名称”,0100);
m_listControl.InsertColumn(2,“年龄”,0,60);
m_listControl.InsertColumn(3,“部门”,0100);
m_listControl.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_ageVariable=“18”;
更新数据(假);
return TRUE;//除非将焦点设置为控件,否则返回TRUE
//异常:OCX属性页应返回FALSE
}
作废CAddDetailsDlg::OnBnClickedEdit()
{
//TODO:在此处添加控件通知处理程序代码
更新数据();
如果((母校id=“”)母校名称=“”)母校部门=“”)母校年龄变量=“”)
{
MessageBox(“请选择要编辑的项目”,“错误”);
}
其他的
{           
int index=m_listControl.GetSelectionMark();
SetItemText(索引,0,m_id);
SetItemText(索引,1,m_名称);
SetItemText(索引,2,m_ageVariable);
SetItemText(索引,3,m_部门);
MessageBox(“已成功更新”、“信息”);
}       
}
void CAddDetailsDlg::OnBnClickedNewButton()无效
{
//TODO:在此处添加控件通知处理程序代码
更新数据();
如果((母校id=“”)母校名称=“”)母校部门=“”)母校年龄变量=“”)
{
MessageBox(“请填写所有详细信息”,“错误”);
}
其他的
{       
int count=m_listControl.GetItemCount();
count=m_listControl.InsertItem(count,m_id);
m_listControl.SetItemText(计数,1,m_名称);
SetItemText(count,2,m_ageVariable);
m_listControl.SetItemText(计数,3,m_部门);
}
}
注意:-

如果我只更新ID,则更新功能可以正常工作。如果我尝试更新所有/多个文件,则只更新ID,而不更新其他内容。顺便说一句,age是一个spinControl,department是一个comboBox,另外两个是editBox

编辑:-

我发现变量
m_name
的值和editBox的值都会在
m_listControl.SetItemText(index,0,m_id)行之后变为旧值。这与
m_age
m_department
的情况相同。 如果我注释行
m_listControl.SetItemText(index,0,m_id),我可以一次更新除ID之外的所有内容


我可以通过将
m_name
m_age
m_department
存储在一个局部变量中,就在
m_listControl.SetItemText(索引,0,m_id)行的前面,来更新所有内容
并在
SetItemText()
中使用这些变量。但在我学习的过程中,我想知道我哪里出了问题。

我想你忘了在更新中的代码之前添加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);

更新项目后,尝试发送一些消息

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

首先,确保控件的所有者数据属性设置为FALSE

可以尝试在最后一次
SetItemText()
之后更新(索引)

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

关闭排序。 在设计器中:
属性>行为>排序设置为无。

您必须首先将项添加到0列索引中

listcontrol->InsertItem(0,_T(“文本”)

然后,您可以将文本设置为子项


listctrol->SetItemText(0,1,_T(子文本)):

您调试了它吗?在
int index=m_listControl.GetSelectionMark()
之后,m
index
的值是多少?请在“注意”下显示您描述的两个版本的代码。通常在这里提问时,不要描述你的代码,展示出来。@Micheal walz,这是用户在UI中会做的两种情况,不是我的代码的任何单独版本。调试时,“m_name”值是正确的值。但是在“m_listControl.SetItemText(index,0,m_id);”行之后,m_name采用旧值。我不知道。请通过编辑您的问题来解释。@MichaelWalz,对不起。我的错。我现在更新了问题,我已经试过了。没有任何帮助。不知何故,变量的值和editBox中的值都会更改为旧的值(即使我不使用UpdateData()。我认为问题在于我的更新方式。在事情出现之前加入随机代码并不是一个可行的解决策略。如果你不能解释为什么这样做是可行的,那就不行了。因此,仍有100名MFC开发人员在贡献他们的专业知识。这不是我第一次得到你们的反对票。我的工作