📄 listdoc.cpp
字号:
for(i =0; i < m_pListCtrl->GetItemCount(); i++)
{
//nData = m_pListCtrl->GetItemData(i);
nData = GetModify(i);
if(nData == LD_NEW ||
nData == LD_EDIT) //新增
{
if (nData == LD_NEW)
{
if(!m_RecordSet.AddNew()) goto err01;
}
else
{
//sKey = m_pListCtrl->GetItemTextEx(i, m_strText);
nSubItem = _GetSubItem(m_strText);
sKey = m_pListCtrl->GetItemText(i, nSubItem);
if(!_MoveSelect(sKey, nRet)) goto err01;
}
for (j=0; j < m_data.size(); j++)
{
Cell = m_data.at(j);
if (Cell.dwStyle & CDD_UPDATE)
{
sText = m_pListCtrl->GetItemText(i, Cell.iIndexCol);
//日期为空值
if(Cell.nClass == CDN_DATEEDIT && sText == _T(" - - "))
sText.Empty();
else if(Cell.nClass == CDN_TIMEEDIT && sText == _T(" : "))
sText.Empty();
else if(Cell.nClass == CDN_DATETIMEEDIT && sText == _T(" - - : "))
sText.Empty();
//主键值为负数,表示自动ID
if(Cell.strName == m_strKey && Cell.dwStyle & CDD_AUTOKEY)
continue;
if (!m_RecordSet.PutCollect(Cell.strName, sText)) goto err01;
}//end if
}//end for
if(!m_RecordSet.Update()) goto err01;
SetModify(i, LD_NONE);
}//end if
}//end for
m_bModify = false;
m_caKey.RemoveAll();
if(bTrans) m_pConnection->CommitTrans();
return TRUE;
err01:
if(bTrans) m_pConnection->RollbackTrans();
if (bMsg)
::MessageBox(NULL,"注意:保存资料失败!","系统提示", MB_OK|MB_ICONEXCLAMATION);
return FALSE;
}
/////////////////////////////////////////
//初始化控件与列表介面
//注:Reset只清除控件不清除列表
void CListDoc::ResetAll()
/////////////////////////////////////////
{
// CDlgDoc::Reset();
if(m_pListCtrl==NULL)return;
m_pListCtrl->SetRedraw(false);
m_pListCtrl->DeleteAllItems();
m_pListCtrl->SetRedraw(true);
m_caKey.RemoveAll();
m_bModify = false;
}
/////////////////////////////////////////////////
//初始化列表控件
//控件名称、位置、宽度、对齐方式在CDialog
//窗口对相应的控件中取出
BOOL CListDoc::InitList()
/////////////////////////////////////////////////
{
CDlgDataCell Cell;
int nFmt, i, j, nIndex = 0;
if(m_pListCtrl==NULL) return false;
//设置默认为格式:网格/选全行
DWORD dwStype = m_pListCtrl->GetExtendedStyle();
dwStype |= (LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT);
m_pListCtrl->SetExtendedStyle(dwStype);
//排序
for (i=0; i < m_data.size(); i++)
{
for (j=i+1; j < m_data.size(); j++)
{
if(m_data[i].iIndexCol > m_data[j].iIndexCol)
{
Cell = m_data.at(i);
m_data[i] = m_data[j];
m_data[j] = Cell;
}//end if
}//end for
m_data[i].iIndexCol = i; //设置新的列号
}//end for
//新建指定位置列
for (i=0; i < m_data.size(); i++)
{
Cell = m_data.at(i);
//不加入列表中
nIndex = Cell.iIndexCol;
//对齐方式
if (Cell.dwStyle & CDD_CENTER)
nFmt = LVCFMT_CENTER;
else if (Cell.dwStyle & CDD_RIGHT)
nFmt = LVCFMT_RIGHT;
else
nFmt = LVCFMT_LEFT;
//取出列名
if(Cell.strText.GetLength() == 0)
{//取默认值
Cell.strText = Cell.strName;
m_data[i] = Cell;
}
//新增
if(m_pListCtrl->InsertColumn(nIndex,
Cell.strText,
nFmt,
Cell.nWidth, -1) == -1)
return FALSE;
}//end for
//额外增加一列,用于保存修改状态
m_pListCtrl->InsertColumn(nIndex+1, "_STATE", 0,0, -1);
return true;
}
void CListDoc::Release()
{
_DeleteAllColumns();
CDlgDoc::Release();
}
/////////////////////////////////////////////////
//根据ReportCtrl的位置移动数据库指针
//行内必需包含单一主键列
//nItem 指定行号
BOOL CListDoc::_CheckKey(CString &sNewKey)
/////////////////////////////////////////////////
{
CString sKey;
for(int i =0; i < m_pListCtrl->GetItemCount(); i++)
{
int nSubItem = _GetSubItem(m_strText);
sKey = m_pListCtrl->GetItemText(i, nSubItem);
if (sKey == sNewKey) return false;
}
return true;
}
/////////////////////////////////////////////////
//根据ReportCtrl的位置移动数据库指针
//行内必需包含单一主键列
//nItem 指定行号
BOOL CListDoc::_MoveSelect(int nItem)
/////////////////////////////////////////////////
{
//返回当前项的主键值
CString sKey, sSql;
DataTypeEnum nRet;
if (nItem < 0 ) return false;
if (!m_pListCtrl) return false;
int nSubItem = _GetSubItem(m_strText);
sKey = m_pListCtrl->GetItemText(nItem, nSubItem);
if(sKey == _T(""))
{
::MessageBox(NULL,"错误:主键不能为空!","系统提示", MB_OK|MB_ICONEXCLAMATION);
return false;
}
if(!m_RecordSet.MoveFirst()) return false;
nRet = m_RecordSet.GetFieldType(m_strKey);
if (nRet == adChar || nRet == adBSTR ||
nRet == adVarWChar || nRet == adWChar)
sSql = m_strKey + "= '" + sKey + "'"; //字符对比
else
sSql = m_strKey + "=" + sKey; //非字符对比
if(!m_RecordSet.Find(sSql)) return false;
return true;
}
/////////////////////////////////////////////////
//根据ReportCtrl的位置移动数据库指针
//行内必需包含单一主键列
//sKey 指定主键
//nMode 指定主键类型
BOOL CListDoc::_MoveSelect(CString sKey, int nMode)
/////////////////////////////////////////////////
{
//返回当前项的主键值
if(!m_RecordSet.MoveFirst()) return false;
if (nMode == adChar || nMode == adBSTR ||
nMode == adVarWChar || nMode == adWChar)
{
sKey = m_strKey + "= '" + sKey + "'"; //字符对比
}
else
{
sKey = m_strKey + "=" + sKey; //非字符对比
}
return m_RecordSet.Find(sKey);
}
BOOL CListDoc::SetModify(int nItem, int nFlog)
{
char szData[2];
int nData;
szData[1] = NULL;
if(m_pListCtrl==NULL)return false;
nData = GetModify(nItem);
int nSubItem = _GetSubItem(_T("_STATE"));
if(nFlog == LD_NEW)
{//新增
szData[0] = LD_NEW;
m_pListCtrl->SetItemText(nItem, nSubItem, szData);
}
else if(nData != LD_NEW)
{//不是新增,修改成其它类型
szData[0] = nFlog;
m_pListCtrl->SetItemText(nItem, nSubItem, szData);
}
//设置无修改标志
if(nFlog != LD_NONE) m_bModify = true;
return true;
}
int CListDoc::GetModify(int nItem)
{
char szData[2];
szData[0] = NULL;
szData[1] = NULL;
if(m_pListCtrl==NULL)return -1;
int nSubItem = _GetSubItem(_T("_STATE"));
m_pListCtrl->GetItemText(nItem, nSubItem, szData, 2);
return (int)szData[0];
}
void CListDoc::Db2List(CAdoRecordSet *pRecordSet)
{
//导入
int nItem, i, nSubItem;
CDlgDataCell Cell;
CString strText;
nItem = m_pListCtrl->InsertItem(0,_T(""));
//导入一行
for (i=0; i < m_data.size(); i++)
{
Cell = m_data.at(i);
if ((Cell.dwStyle & CDD_RETRIEVE) &&
pRecordSet->GetCollect(Cell.strName, strText))
{
if(Cell.nClass == CDN_DATEEDIT ||
Cell.nClass == CDN_LONGDATECTRL ||
Cell.nClass == CDN_SHORTDATECTRL )
{//是日期类型,只取出日期部份
if(strText.IsEmpty())
strText = _T(" - - ");
else
strText = strText.Left(10);
}
else if(Cell.nClass == CDN_TIMEEDIT ||
Cell.nClass == CDN_TIMECTRL)
{//是时间类型,只取出时间部份
if(strText.IsEmpty())
strText = _T(" : ");
else if(strText.GetLength() >= 15)
{
strText = strText.Mid(11, 5);
}
}
else if(Cell.nClass == CDN_DATETIMEEDIT)
{//是时间类型,只取出时间部份
if(strText.IsEmpty())
strText = _T(" - - : ");
}
nSubItem = Cell.iIndexCol;
m_pListCtrl->SetItemText(nItem, nSubItem, strText);
//m_pListCtrl->SetItemData(nItem, LD_NONE);
}//end if
}//end for
SetModify(nItem, LD_NONE);
}
BOOL CListDoc::_DeleteAllColumns()
{
if(m_pListCtrl == NULL) return false;
return true;
}
int CListDoc::_GetSelected()
{
ASSERT(m_pListCtrl);
int nItem = -1;
POSITION pos = m_pListCtrl->GetFirstSelectedItemPosition();
if(pos) nItem = m_pListCtrl->GetNextSelectedItem(pos);
return nItem;
}
int CListDoc::_GetSubItem(LPCSTR pItemName)
{
ASSERT(m_pListCtrl);
CHeaderCtrl *pHeader = m_pListCtrl->GetHeaderCtrl();
if(pHeader == NULL) return -1;
CString sName;
char buf[129];
HDITEM Item;
for(int i = 0; i < pHeader->GetItemCount( ) ; i++)
{
memset(&Item, 0, sizeof(HDITEM));
Item.mask = HDI_TEXT;
Item.pszText = buf;
Item.cchTextMax = 128;
pHeader->GetItem(i, &Item);
sName = Item.pszText;
sName.TrimLeft(); sName.TrimRight();
if (sName == pItemName) return i;
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -