在涉及到sqlite3的操作时不得不考虑创建页表,之前我们都是通过语句直接创建的,你当然也可以这样,不过基于优化界面和考虑到普通用户(我的项目组长这么跟我说的)并不知道sqlite3语句,这时就要思考如何才能做到创建页表.
创建页表最简单的就是拉几个Edit control,往里面输入数据再读取,不过这样做出来的界面仅支持创建你提供的edit control控件个数的字段的页表,并不能做到动态创建页表,例如我下面的就只能创建固定字段的页表
这是我最开始的想法,不过基于功能的提升及界面的优化,这个界面被我放弃了.在深入了解MFC控件后,我考虑到可以使用list control来作为创建页表的平台.下面讲一下我的具体思路:
①创建一个对话框,里面先拖进list control,给对话框添加好类CTipDlg11(下面控件各项属性最好跟我一致,不然名字太多可能会混乱),给list control添加变量,再拖进几个button作为触发按钮,再拖进几个edit control作为显示,界面大抵如下
为了方便介绍界面,下面我附上Ctrl+D后的界面
9是list control设置
添加变量,用于显示要创建的页表的字段以及字段的数据类型和键值
1添加value变量,用于显示,记录要创建的表名
10和11是我当时调试界面数据时用到的,我设置的隐形控件,这里就不介绍
12和13是用来显示并记录最终创建页表的SQL语句,给12添加value变量m_string23,给13添加value变量m_string24
②创建一个对话框添加类CTipDlg111,用于控制输入页表字段的各项属性(由于我不是专门做sqlite3开发的,所以这里就简单的意思一下),拖进edit control,拖进combo box用于提示选择数据类型,拖进check box用于选择是否为键值.界面大抵如下
Ctrl+D
3用来输入和保存列名,添加value变量设置id
6用来选择数据类型,添加value变量设置
8是用来保存7的返回值,添加value变量设置
③创建一个对话框添加类CTipDlg112,这个界面比较简单,这有一个edit control
给edit control添加value变量设置
到这里基本的界面就做完了,下面给出各界面对应的代码
首先是创建页表界面,上面我给创建页表界面添加了类CTipDlg11,去解决方案管理器中找到TipDlg11.cpp
TipDlg11.cpp代码如下(因为这不是我的主窗口,所以要自己添加窗口初始化函数BOOL CTipDlg11::OnInitDialog())
// TipDlg11.cpp : 实现文件
//
#include "stdafx.h"
#include "528Update_Mfc.h"
#include "TipDlg11.h"
#include "TipDlg111.h"
#include "TipDlg112.h"
// CTipDlg11 对话框
IMPLEMENT_DYNAMIC(CTipDlg11, CDialog)
CTipDlg11::CTipDlg11(CWnd* pParent /*=NULL*/)
: CDialog(CTipDlg11::IDD, pParent)
//, m_string20(_T(""))
, m_string21(_T(""))
, m_string23(_T(""))
, m_string24(_T(""))
{
}
CTipDlg11::~CTipDlg11()
{
}
void CTipDlg11::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_list5);
// DDX_Text(pDX, IDC_EDIT3, m_string20);
DDX_Text(pDX, IDC_EDIT4, m_string21);
DDX_Text(pDX, IDC_EDIT9, m_string23);
DDX_Text(pDX, IDC_EDIT10, m_string24);
}
BEGIN_MESSAGE_MAP(CTipDlg11, CDialog)
ON_BN_CLICKED(IDC_BUTTON1, &CTipDlg11::OnBnClickedButton1)
ON_NOTIFY(NM_CLICK, IDC_LIST1, &CTipDlg11::OnNMClickList1)
ON_BN_CLICKED(IDC_BUTTON2, &CTipDlg11::OnBnClickedButton2)
ON_BN_CLICKED(IDC_BUTTON3, &CTipDlg11::OnBnClickedButton3)
// ON_BN_CLICKED(IDC_BUTTON4, &CTipDlg11::OnBnClickedButton4)
ON_BN_CLICKED(IDC_BUTTON10, &CTipDlg11::OnBnClickedButton10)
END_MESSAGE_MAP()
// CTipDlg11 消息处理程序
BOOL CTipDlg11::OnInitDialog() //自己添加
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
if(m_list5.GetItemCount() == 0) //判断列表项是否存在
{
m_list5.InsertColumn(0,_T("字段名"));
m_list5.InsertColumn(1,_T("数据类型"));
m_list5.InsertColumn(2,_T("键值"));
}
CRect rect;
m_list5.SetExtendedStyle(m_list5.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );
m_list5.GetClientRect(&rect);
m_list5.SetColumnWidth(0,rect.Width()/3);
m_list5.SetColumnWidth(1,rect.Width()/3);
m_list5.SetColumnWidth(2,rect.Width()/3);
GetDlgItem(IDC_EDIT1)->ShowWindow(false); //隐藏两个文本框
GetDlgItem(IDC_EDIT2)->ShowWindow(false);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
char name[20] = {0}; //定义name用来存放增加列时输入的页表名字
void CTipDlg11::OnBnClickedButton1() //增加列
{
// TODO: 在此添加控件通知处理程序代码
INT_PTR nRes; // 用于保存DoModal函数的返回值
CTipDlg111 tipDlg1; // 构造对话框类CTipDlg1的实例
nRes = tipDlg1.DoModal(); // 弹出对话框
UpdateData(TRUE); // 将各控件中的数据保存到相应的变量
CString buf1 = tipDlg1.m_string18;
char * buff1 = (char * )buf1.GetBuffer(buf1.GetLength());
CString buf2 = tipDlg1.m_string19;
char * buff2 = (char * )buf2.GetBuffer(buf2.GetLength());
CString buf3 = tipDlg1.m_string20;
char * buff3 = (char * )buf3.GetBuffer(buf2.GetLength());
int buff4 = atoi(buff3); //cstring转int
/*SetDlgItemText(IDC_EDIT1, buf1);
SetDlgItemText(IDC_EDIT2, buf2);*/
CRect rect;
// 获取编程语言列表视图控件的位置和大小
m_list5.GetClientRect(&rect);
// 为列表视图控件添加全行选中和栅格风格
m_list5.SetExtendedStyle(m_list5.GetExtendedStyle() | LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES );
if (IDOK == nRes) //判断窗口的返回值(即窗口返回时点击了什么按钮)
{
int i = m_list5.GetItemCount();//获取list里面有多少行
CString ttt;
ttt.Format("%d",i);
m_list5.InsertItem(i,buff1); //开辟一个行,并且设置行的内容为i的内容
m_list5.SetItemText(i,1,buff2);//i代指在第几行插入数据,第二个参数代指第几列,第三个参数代指插入数据的值
if (1 == buff4)
{
m_list5.SetItemText(i,2,_T("primary key"));//i代指在第几行插入数据,第二个参数代指第几列,第三个参数代指插入数据的值
}
}
}
void CTipDlg11::OnNMClickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
*pResult = 0;
CString strLangName; // 选择语言的名称字符串
NMLISTVIEW *pNMListView = (NMLISTVIEW*)pNMHDR;
if (-1 != pNMListView->iItem) // 如果iItem不是-1,就说明有列表项被选择
{
// 获取被选择列表项第一个子项的文本
strLangName = m_list5.GetItemText(pNMListView->iItem, 0);
// 将选择的语言显示与编辑框中
SetDlgItemText(IDC_EDIT1, strLangName);
SetDlgItemText(IDC_EDIT2, "id为"+strLangName+"的记录被选中");
//SetDlgItemText(IDC_EDIT3, " ");
UpdateData(TRUE);
}
}
void CTipDlg11::OnBnClickedButton2() // 删除列 先单击list control表,再点击删除列可以删除
{
// TODO: 在此添加控件通知处理程序代码
int nItem = -1;
POSITION pos;
while (pos = m_list5.GetFirstSelectedItemPosition())
{
nItem = -1;
nItem = m_list5.GetNextSelectedItem(pos);
if (nItem >= 0 && m_list5.GetSelectedCount() > 0)
{
m_list5.DeleteItem(nItem);
}
}
}
void CTipDlg11::OnBnClickedButton10() //输入表名
{
// TODO: 在此添加控件通知处理程序代码
INT_PTR nRes; // 用于保存DoModal函数的返回值
CTipDlg112 tipDlg1; // 构造对话框类CTipDlg1的实例
nRes = tipDlg1.DoModal(); // 弹出对话框
UpdateData(TRUE); // 将各控件中的数据保存到相应的变量
CString buf1 = tipDlg1.m_string22;
char * buff1 = (char * )buf1.GetBuffer(buf1.GetLength());
SetDlgItemText(IDC_EDIT4,buf1);
UpdateData(TRUE); // 将各控件中的数据保存到相应的变量
}
int allnum = 0; //定义一个变量用于记录list control中有多少数据,这关系到li数组的下标
void CTipDlg11::OnBnClickedButton3() //创建页表
{
// TODO: 在此添加控件通知处理程序代码
int hang = m_list5.GetItemCount();//获取list里面有多少行 行为0~ hang-1
int lie = 3; //列为0.1.2
int jishu = 0;
//CString str = m_list5.GetItemText(0,0);// 取第一行第一列
//CString str =m_list5.GetItemText(hang - 1,0); //取第row行第col列!
// SetDlgItemText(IDC_EDIT2, str);
CString data[1024] = {0};
char * li[1024] = {0};
for (int i = 0;i < hang;i++) //把list control中所有数据取出并转换成char*类型存放在li数组中
{
for(int j = 0;j < lie;j++)
{
data[jishu] = m_list5.GetItemText(i,j);
li[jishu] = (char * )data[jishu].GetBuffer(data[jishu].GetLength());
jishu++;
}
}
SetDlgItemText(IDC_EDIT2, data[1]);
/*CString a;
a.Format("%s",li[1]);
SetDlgItemText(IDC_EDIT1, a);*/
CString buf1 = m_string21; //获取页表名字
char * buff1 = (char * )buf1.GetBuffer(buf1.GetLength());
// SetDlgItemText(IDC_EDIT1, buf1);
allnum = hang*lie;
/*CString a; //int转CString
a.Format("%d", allnum);
SetDlgItemText(IDC_EDIT1, a);*/
char str1[] = {" ("};
char str2[] = {","};
char str3[] = {")"};
char str4[] = {" "};
char str5[] = {"'"};
int j = 1;
//下面开始编写创建页表的语句
char lijiaxin[1024] = {"create table "};
strcat(lijiaxin,buff1);
strcat(lijiaxin,str1); //到这里 create table buff1 (
for(int i = 0 ;i < allnum;i++)
{
if(li[i] != "0")
{
strcat(lijiaxin,li[i]);
strcat(lijiaxin,str4);
}
if(j%3 == 0 && j != allnum)
{
strcat(lijiaxin,str2);
}
j++;
}
strcat(lijiaxin,str3);
SetDlgItemText(IDC_EDIT9, lijiaxin);
//创建页表的语句到这里结束
//创建表时自动插入一条语句
char jiaxin[521] = {0};
sprintf(jiaxin,"insert into %s values ( 001,",buff1);
char * likeyou = "Please enter";
for (int i = 1;i < hang;i++)
{
strcat(jiaxin,str5);
strcat(jiaxin,likeyou);
// if(i != hang )
strcat(jiaxin,str5);
if(i != hang -1 )
strcat(jiaxin,str2);
}
strcat(jiaxin,str3);
SetDlgItemText(IDC_EDIT10, jiaxin);
//插入语句完成
//语句写成功,接下来执行exec完成页表的创建
}
TipDlg111.cpp代码如下(因为这不是我的主窗口,所以要自己添加窗口初始化函数BOOL CTipDlg11::OnInitDialog())
// TipDlg111.cpp : 实现文件
//
#include "stdafx.h"
#include "528Update_Mfc.h"
#include "TipDlg111.h"
// CTipDlg111 对话框
IMPLEMENT_DYNAMIC(CTipDlg111, CDialog)
CTipDlg111::CTipDlg111(CWnd* pParent /*=NULL*/)
: CDialog(CTipDlg111::IDD, pParent)
, m_string18(_T(""))
, m_string19(_T(""))
, m_string20(_T(""))
{
}
CTipDlg111::~CTipDlg111()
{
}
void CTipDlg111::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT1, m_string18);
DDX_CBString(pDX, IDC_COMBO1, m_string19);
DDX_Control(pDX, IDC_CHECK3, m_check1);
DDX_Text(pDX, IDC_EDIT2, m_string20);
}
BEGIN_MESSAGE_MAP(CTipDlg111, CDialog)
ON_CBN_SELCHANGE(IDC_COMBO1, &CTipDlg111::OnCbnSelchangeCombo1)
ON_BN_CLICKED(IDOK, &CTipDlg111::OnBnClickedOk)
END_MESSAGE_MAP()
// CTipDlg111 消息处理程序
void CTipDlg111::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
}
BOOL CTipDlg111::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
GetDlgItem(IDC_EDIT2)->ShowWindow(false);
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CTipDlg111::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
if (1 == m_check1.GetCheck())
{
SetDlgItemText(IDC_EDIT2,_T("1"));
}
OnOK();
}
CTipDlg112这个窗口没有在源程序中编写代码,就不给TipDlg112.cpp的代码了.
上面我没有给出button的属性参数,可以自己根据代码注释自行修改.
上面的代码可以参考思路过程,由于我是做完后写的博客,可能你在根据本博客实现时会出各种各样的问题,还请自己解决或在下方留言,我工作日都会登录博客,希望可以解决你的问题