【发布时间】:2016-02-10 10:56:41
【问题描述】:
我是构建 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 得到更新,没有别的。顺便说一句,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); 行之前的局部变量中并在SetItemText() 中使用这些变量来更新所有内容。但随着我的学习,我想知道我哪里错了。
【问题讨论】:
-
你调试了吗?
int index=m_listControl.GetSelectionMark()之后的mindexright的值是多少? -
请显示您在“注释”下描述的代码的两个版本。一般在这里提问的时候,不要描述你的代码,展示出来。
-
@Micheal walz,这是用户在 UI 中执行的两种情况,而不是我的代码的任何单独版本。在调试时,'m_name' 值是正确的值。但在 'm_listControl.SetItemText(index,0,m_id);' 行之后, m_name 采用旧值。我不知道。
-
请通过编辑您的问题进行解释。
-
@MichaelWalz,对不起。我的错。我现在更新了问题。
标签: c++ visual-studio-2010 visual-c++ mfc