C++ MFC CListCtrl::SetItemText()不工作
我是构建MFC应用程序的初学者。我刚刚开始使用列表控件(在报表视图中),在更新列表时遇到了一些问题。我有三个按钮用于添加、更新和删除。除了更新之外,一切都很好。这是密码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(
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()
之后,mindex
的值是多少?请在“注意”下显示您描述的两个版本的代码。通常在这里提问时,不要描述你的代码,展示出来。@Micheal walz,这是用户在UI中会做的两种情况,不是我的代码的任何单独版本。调试时,“m_name”值是正确的值。但是在“m_listControl.SetItemText(index,0,m_id);”行之后,m_name采用旧值。我不知道。请通过编辑您的问题来解释。@MichaelWalz,对不起。我的错。我现在更新了问题,我已经试过了。没有任何帮助。不知何故,变量的值和editBox中的值都会更改为旧的值(即使我不使用UpdateData()。我认为问题在于我的更新方式。在事情出现之前加入随机代码并不是一个可行的解决策略。如果你不能解释为什么这样做是可行的,那就不行了。因此,仍有100名MFC开发人员在贡献他们的专业知识。这不是我第一次得到你们的反对票。我的工作