📄 xskqview.cpp
字号:
// xskqView.cpp : implementation of the CXskqView class
//
#include "stdafx.h"
#include "xskq.h"
#include "xskqDoc.h"
#include "xskqView.h"
#include "MainFrm.h"
#include "StudentAddDlg.h"
#include "StudentRecordSet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CXskqView
IMPLEMENT_DYNCREATE(CXskqView, CListView)
BEGIN_MESSAGE_MAP(CXskqView, CListView)
//{{AFX_MSG_MAP(CXskqView)
ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CXskqView construction/destruction
CXskqView::CXskqView()
{
// TODO: add construction code here
}
CXskqView::~CXskqView()
{
}
BOOL CXskqView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
//注释:设置CListCtrl的格式为:LVS_REPORT并且LVS_SINGLESEL
//cs.style|=LVS_REPORT|LVS_SINGLESEL;
return CListView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CXskqView drawing
void CXskqView::OnDraw(CDC* pDC)
{
CXskqDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
void CXskqView::OnInitialUpdate()
{
//创建一个CListCtrl指针,
//CListCtrl *ctl;
//将CListCtrl指针指向
//ctl=&GetListCtrl();
//设置列的题头
// ctl->InsertColumn(0,"年级",LVCFMT_LEFT,80);
//ctl->InsertColumn(1,"班级",LVCFMT_LEFT,80);
// ctl->InsertColumn(2,"学号",LVCFMT_LEFT,80);
//ctl->InsertColumn(3,"姓名",LVCFMT_LEFT,80);
//ctl->InsertColumn(4,"性别",LVCFMT_LEFT,80);
// ctl->InsertColumn(5,"年龄",LVCFMT_LEFT,80);
//ctl->InsertColumn(6,"家庭地址",LVCFMT_LEFT,100);
// ctl->InsertColumn(7,"联系方式",LVCFMT_LEFT,120);
//输入一组测试值的题头
// ctl->InsertItem(0,"4");
// ctl->SetItemText(0,1,"3");
// ctl->SetItemText(0,2,"23");
// ctl->SetItemText(0,3,"红飞");
// ctl->SetItemText(0,4,"男");
// ctl->SetItemText(0,5,"19");
// ctl->SetItemText(0,6,"南京");
// ctl->SetItemText(0,7,"123456789");
CListView::OnInitialUpdate();
SetListCtrlStyle();
SetTitle();
// CMainFrame * m_Frm = (CMainFrame *)::AfxGetMainWnd();
// m_Frm->m_ListView = this;
// TODO: You may populate your ListView with items by directly accessing
// its list control through a call to GetListCtrl().
}
/////////////////////////////////////////////////////////////////////////////
// CXskqView printing
BOOL CXskqView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CXskqView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CXskqView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CXskqView diagnostics
#ifdef _DEBUG
void CXskqView::AssertValid() const
{
CListView::AssertValid();
}
void CXskqView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}
CXskqDoc* CXskqView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXskqDoc)));
return (CXskqDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CXskqView message handlers
void CXskqView::EditCurStudent()
{
//建立一个指针,用以操作ListCtrl输出用户记录
CListCtrl *ctl;
ctl=&GetListCtrl();
//寻找当前选中的记录的位置
POSITION pos=ctl->GetFirstSelectedItemPosition();
if (pos==NULL)
{
//如果没有选择记录,则提示并退出
AfxMessageBox("请先选中一条记录!");
return;
}
//获取当前记录的位置游标
int m_CurStudent=ctl->GetNextSelectedItem(pos);
//
//创建一个CStudentAddDlg的实例
CStudentAddDlg m_StudentAddDlg;
//创建一个临时字符串来保存当前用户信息
char chrTemp[201] = {'\0'};
//初始化m_StudentAddDlg的用户信息
ctl->GetItemText(m_CurStudent,0,chrTemp,sizeof(char[80]));
m_StudentAddDlg.m_StudentGrade = chrTemp;
ctl->GetItemText(m_CurStudent,1,chrTemp,sizeof(char[80]));
m_StudentAddDlg.m_StudentClass = chrTemp;
ctl->GetItemText(m_CurStudent,2,chrTemp,sizeof(char[80]));
m_StudentAddDlg.m_StudentID = chrTemp;
ctl->GetItemText(m_CurStudent,3,chrTemp,sizeof(char[80]));
m_StudentAddDlg.m_StudentName = chrTemp;
ctl->GetItemText(m_CurStudent,4,chrTemp,sizeof(char[80]));
m_StudentAddDlg.m_StudentSex = chrTemp;
ctl->GetItemText(m_CurStudent,5,chrTemp,sizeof(char[80]));
m_StudentAddDlg.m_StudentAge = chrTemp;
ctl->GetItemText(m_CurStudent,6,chrTemp,sizeof(char[100]));
m_StudentAddDlg.m_StudentAddr = chrTemp;
ctl->GetItemText(m_CurStudent,7,chrTemp,sizeof(char[120]));
m_StudentAddDlg.m_StudentPhone = chrTemp;
//设置用户对话框窗口标题
m_StudentAddDlg.m_Title = "修改学生信息";
//将变量内容更新到对话框中,并显示对话框
if(m_StudentAddDlg.DoModal()!=IDOK)
{
//如果用户选择取消按钮,则退出
return;
}
//如果用户选择了"确定按钮",则进行下面的数据库更新
//取得用户ID
ctl->GetItemText(m_CurStudent,0,chrTemp,sizeof(char[80]));
//将用户ID转换为整数保存,后面的数据库操作将以此为匹配条件
int m_CurStudentGrade = atoi(chrTemp);
//创建CUserRecordSet的实例
CStudentRecordSet m_StudentRecordSet;
try
{
if(m_StudentRecordSet.IsOpen())
m_StudentRecordSet.Close();
//输入匹配条件StudentID = m_CurstudentID
m_StudentRecordSet.m_strFilter.Format(" StudentGrade = %d order by StudentGrade",m_CurStudentGrade);
m_StudentRecordSet.Open(CRecordset::snapshot,NULL,CRecordset::none);
//如果用户记录存在,则进行修改操作
if(m_StudentRecordSet.IsOpen() && !m_StudentRecordSet.IsEOF())
{
//设置编辑当前记录
m_StudentRecordSet.Edit();
//开始编辑该条记录的内容
m_StudentRecordSet.m_StudentGrade = m_StudentAddDlg.m_StudentGrade;
m_StudentRecordSet.m_StudentClass = m_StudentAddDlg.m_StudentClass;
m_StudentRecordSet.m_StudentID = m_StudentAddDlg.m_StudentID;
m_StudentRecordSet.m_StudentName = m_StudentAddDlg.m_StudentName;
m_StudentRecordSet.m_StudentSex = m_StudentAddDlg.m_StudentSex;
m_StudentRecordSet.m_StudentAge = m_StudentAddDlg.m_StudentAge;
m_StudentRecordSet.m_StudentAddr = m_StudentAddDlg.m_StudentAddr;
m_StudentRecordSet.m_StudentPhone = m_StudentAddDlg.m_StudentPhone;
//如果可以更新,则更新到数据库
if(m_StudentRecordSet.CanUpdate())
{
m_StudentRecordSet.Update();
}
//更新完毕,关闭数据库
if(m_StudentRecordSet.IsOpen())
m_StudentRecordSet.Close();
//提示用户,修改成功
AfxMessageBox("修改成功!");
}
else //考虑特例,如果操作中用户信息不存在了
{
//关闭数据库
if(m_StudentRecordSet.IsOpen())
m_StudentRecordSet.Close();
//提示用户
AfxMessageBox("该记录不存在,无从修改!");
return;
}
}
catch(CDBException*e)
{
e->ReportError ();
//e->Delete ();
return;
}
//将用户信息及时更新到ListCtrl中
ctl->SetItemText(m_CurStudent,0,m_StudentAddDlg.m_StudentGrade);
ctl->SetItemText(m_CurStudent,1,m_StudentAddDlg.m_StudentClass);
ctl->SetItemText(m_CurStudent,2,m_StudentAddDlg.m_StudentID);
ctl->SetItemText(m_CurStudent,3,m_StudentAddDlg.m_StudentName);
ctl->SetItemText(m_CurStudent,4,m_StudentAddDlg.m_StudentSex);
ctl->SetItemText(m_CurStudent,5,m_StudentAddDlg.m_StudentAge);
ctl->SetItemText(m_CurStudent,6,m_StudentAddDlg.m_StudentAddr);
ctl->SetItemText(m_CurStudent,7,m_StudentAddDlg.m_StudentPhone);
}
void CXskqView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
*pResult = 0;
EditCurStudent();
}
void CXskqView::DelCurStudent()
{
//建立一个指针,用以操作ListCtrl输出用户记录
CListCtrl *ctl;
ctl=&GetListCtrl();
//寻找当前选中的记录的位置
POSITION pos=ctl->GetFirstSelectedItemPosition();
if (pos==NULL)
{
//如果没有选择记录,则提示并退出
AfxMessageBox("请先选中一条记录!");
return;
}
//获取当前记录的位置游标
int m_CurStudent=ctl->GetNextSelectedItem(pos);
//
//创建一个CStudentAddDlg的实例
CStudentAddDlg m_StudentAddDlg;
//创建一个临时字符串来保存当前学生信息
char chrTemp[21] = {'\0'};
//取得学生ID
ctl->GetItemText(m_CurStudent,0,chrTemp,sizeof(char[50]));
//将用户ID转换为整数保存,后面的数据库操作将以此为匹配条件
int m_CurStudentID = atoi(chrTemp);
//创建CStudentRecordSet的实例
CStudentRecordSet m_StudentRecordSet;
try
{
if(m_StudentRecordSet.IsOpen())
m_StudentRecordSet.Close();
//输入匹配条件UserID = m_CuruserID
m_StudentRecordSet.m_strFilter.Format(" StudentID = %d order by StudentID",m_CurStudentID);
m_StudentRecordSet.Open(CRecordset::snapshot,NULL,CRecordset::none);
//如果学生记录存在,则进行修改操作
if(m_StudentRecordSet.IsOpen() && !m_StudentRecordSet.IsEOF())
{
//设置编辑当前记录
m_StudentRecordSet.Delete();
//更新完毕,关闭数据库
if(m_StudentRecordSet.IsOpen())
m_StudentRecordSet.Close();
//提示用户,修改成功
AfxMessageBox("删除成功!");
}
else //考虑特例,如果操作中用户信息不存在了
{
//关闭数据库
if(m_StudentRecordSet.IsOpen())
m_StudentRecordSet.Close();
//提示用户
AfxMessageBox("该记录不存在,无法删除!");
return;
}
}
catch(CDBException*e)
{
e->ReportError ();
//e->Delete ();
return;
}
//在ListCtrl中删除当前用户信息
ctl->DeleteItem(m_CurStudent);
}
void CXskqView::RemoveAll()
{
//增加值针变量指向ListView的CListCtrl
CListCtrl *ctl;
ctl=&GetListCtrl();
//删除CListCtrl中的所有记录;
ctl->DeleteAllItems();
}
void CXskqView::SetListCtrlStyle()
{
DWORD dwStyle = GetWindowLong(m_hWnd, GWL_STYLE);
dwStyle &= ~(LVS_TYPEMASK);
dwStyle &= ~(LVS_EDITLABELS);
// Make sure we have report view and send edit label messages.
SetWindowLong( m_hWnd, GWL_STYLE,
dwStyle | LVS_REPORT|LVS_NOLABELWRAP|LVS_SHOWSELALWAYS);
// Enable the full row selection and the drag drop of headers.
DWORD styles = LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES;
// Use macro since this is new and not in MFC.
ListView_SetExtendedListViewStyleEx(m_hWnd, styles, styles );
}
void CXskqView::SetTitle()
{
TCHAR rgtsz[8][10] = {_T("年级"),_T("班级"),_T("学号"),
_T("姓名"),_T("性别"),_T("年龄"),_T("家庭地址"),_T("联系方式")};
LV_COLUMN lvcolumn;
CRect rect;
this->GetWindowRect(&rect);
for(int i=0;i<8;i++)
{
lvcolumn.mask = LVCF_FMT | LVCF_SUBITEM | LVCF_TEXT
| LVCF_WIDTH | LVCF_ORDER;
lvcolumn.fmt = LVCFMT_LEFT;
lvcolumn.pszText = rgtsz[i];
lvcolumn.iSubItem = i;
lvcolumn.iOrder = i;
lvcolumn.cx = rect.Height()/3;
GetListCtrl().InsertColumn(i, &lvcolumn);
}
}
void CXskqView::ShowStudent(CString strSql)
{
CListCtrl* p = &GetListCtrl();
//清空列表
p->DeleteAllItems();
if(strSql == "")
return;
CXskqDoc* pDoc = (CXskqDoc*)GetDocument();
CCommand<CAccessor<CStudentAccessor> > dbStudent;
long* pCount = new long;
//按照strSql查询符合条件的住户
if(dbStudent.Open(pDoc->m_dbStudent.m_session,strSql,NULL,pCount) != S_OK)
{
AfxMessageBox("error");
delete pCount;
return;
}
int iItem = 0;
LV_ITEM lvitem;
int iActualItem = 0;
//将查询得到的住户都逐个加入列表中
if(dbStudent.MoveFirst() == S_OK)
{
do
{
for(int iSubItem=0;iSubItem<8;iSubItem++)
{
lvitem.mask = LVIF_TEXT|(iSubItem == 0? LVIF_IMAGE : 0);
lvitem.iItem = (iSubItem == 0)? iItem : iActualItem;
lvitem.iSubItem = iSubItem;
lvitem.iImage = (iItem%2)?0:2;
CString str = "";
switch(iSubItem)
{
case 0://年级
str = dbStudent.m_StudentGrade;
lvitem.pszText =(LPTSTR)(LPCTSTR)str;
break;
case 1://班级
{
str = dbStudent.m_StudentClass;
lvitem.pszText = (LPTSTR)(LPCTSTR) str;
break;
}
case 2://学号
{
str = dbStudent.m_StudentID;
lvitem.pszText = (LPTSTR)(LPCTSTR) str;
break;
}
case 3://姓名
{
str = dbStudent.m_StudentName;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 4://性别
{
str = dbStudent.m_StudentSex;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
}
case 5://年龄
{
str = dbStudent.m_StudentAge;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 6://家庭地址
{
str = dbStudent.m_StudentAddr;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
break;
}
case 7://联系方式
{
str = dbStudent.m_StudentPhone;
lvitem.pszText = (LPTSTR)(LPCTSTR)str;
}
}
if (iSubItem == 0)
iActualItem = GetListCtrl().InsertItem(&lvitem);
else
GetListCtrl().SetItem(&lvitem);
}
iItem ++;
}
while( dbStudent.MoveNext() == S_OK );
}
dbStudent.Close();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -