⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xskqview.cpp

📁 一个学生考勤系统
💻 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 + -