核心代码如下,思想就是创建了一个动态的Edit,然后点击列表的item 就可以实现编辑功能,问题是如何保存到库中(不知道SQL语句中 变量该怎么写)
//点击list item中 加入的数据
void ClistEditDlg::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
NM_LISTVIEW *pEditCtrl = (NM_LISTVIEW *)pNMHDR;
printf("行:%d,列:%d\n", pEditCtrl->iItem, pEditCtrl->iSubItem);
if (pEditCtrl->iItem == -1)//点击到非工作区 行= -1
{
if (haveeditcreate == true)//如果之前创建了编辑框就销毁掉
{
distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);//销毁单元格编辑框对象
haveeditcreate = false;
}
}
else if (pEditCtrl->iSubItem != 0)//如果不是性别选项 列 = 0
{
if (haveeditcreate == true)
{
if (!(e_Item == pEditCtrl->iItem && e_SubItem == pEditCtrl->iSubItem))//如果点中的单元格不是之前创建好的
{
distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);
haveeditcreate = false;
createEdit(pEditCtrl, &m_Edit, e_Item, e_SubItem, haveeditcreate);//创建编辑框
}
}
else//如果是性别选项,在单元格处生成下拉列表项
{
if (haveeditcreate == true)//如果之前创建了编辑框就销毁掉
{
distroyEdit(&m_list, &m_Edit, e_Item, e_SubItem);
haveeditcreate = false;
}
else
{
e_Item = pEditCtrl->iItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
e_SubItem = pEditCtrl->iSubItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
}
}
*pResult = 0;
}
//创建编辑框
void ClistEditDlg::createEdit(NM_LISTVIEW *pEditCtrl, CEdit *createdit, int &Item, int &SubItem, bool &havecreat)//
//pEditCtrl为列表对象指针,createdit为编辑框指针对象,
//Item为创建单元格在列表中的行,SubItem则为列,havecreat为对象创建标准
{
Item = pEditCtrl->iItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
SubItem = pEditCtrl->iSubItem;//将点中的单元格的行赋值给“刚编辑过的行”以便后期处理
createdit->Create(ES_AUTOHSCROLL | WS_CHILD | ES_LEFT | ES_WANTRETURN,
CRect(0, 0, 0, 0), this, IDC_EDIT_CREATEID);//创建编辑框对象
havecreat = true;
createdit->SetFont(this->GetFont(), FALSE);//设置字体,不设置这里的话上面的字会很突兀的感觉
createdit->SetParent(&m_list);//将list control设置为父窗口,生成的Edit才能正确定位,这个也很重要
CRect EditRect;
m_list.GetSubItemRect(e_Item, e_SubItem, LVIR_LABEL, EditRect);//获取单元格的空间位置信息
EditRect.SetRect(EditRect.left + 1, EditRect.top + 1, EditRect.left + m_list.GetColumnWidth(e_SubItem) - 1, EditRect.bottom - 1);//+1和-1可以让编辑框不至于挡住列表框中的网格线
CString strItem = m_list.GetItemText(e_Item, e_SubItem);//获得相应单元格字符
createdit->SetWindowText(strItem);//将单元格字符显示在编辑框上
createdit->MoveWindow(&EditRect);//将编辑框位置放在相应单元格上
createdit->ShowWindow(SW_SHOW);//显示编辑框在单元格上面
createdit->SetFocus();//设置为焦点
createdit->SetSel(-1);//设置光标在文本框文字的最后
}
//销毁编辑框
void ClistEditDlg::distroyEdit(CListCtrl *list, CEdit* distroyedit, int &Item, int &SubItem)
{
CString meditdata;
distroyedit->GetWindowTextW(meditdata);
list->SetItemText(Item, SubItem, meditdata);//获得相应单元格字符
distroyedit->DestroyWindow();//销毁对象,有创建就要有销毁,不然会报错
}
//保存
void ClistEditDlg::OnBnClickedButtonSave()
{
CString strSQL;
// szSQL.Format(_T("UPDATE t_item SET ?? "), ???); (这个地方不知道怎么写了,怎么获取动态Edit)
if (m_ado.ExecSQL(szSQL) < 0)
AfxMessageBox(_T("修改失败:") + m_ado.GetLastError());
}