我是构建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_age
和m_department
的情况相同。
如果我对该行m_listControl.SetItemText(index,0,m_id);
发表评论,我可以一次更新所有内容,但 ID 除外。
我可以通过将m_name
,m_age
和m_department
存储在行m_listControl.SetItemText(index,0,m_id);
之前的局部变量中并使用{{1}中的这些变量来更新所有内容}。但是在我学习的过程中,我想知道自己哪里出错了。
答案 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
,因为我觉得在项目数量很多的情况下它会更快,并且从长远来看更容易处理。