在列表控件CListctrl中函数insertcolumn(列索引,列结构指针 )表示按某种方式插入索引列。既然如此,执行了该函数后列表已经完成了(我的意思是把某些列插入后,则形成了一个列表。比如:从星期一--->星期五的课程表,按照星期(列)逐步插入后,则所有的行也就自然形成了(即:第一节课(monday->friday)也形成了)。
问题:为什么还要insertitem函数干什么?下面的代码就是我所说的问题,程序可以运行,但是本人就是有点不明白,请各位大侠指点【用到一点ODBC数据库方面的知识】,如果有人想研究整个程序的代码,敬请联系,我可以给你发过去。第一段代码:
int i=0,j=0;
CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
LV_COLUMN m_Lc;//存储列信息的结构体
m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
//读取记录集的字段信息
for(i=0;i<m_Set->m_nFields;i++)
{
m_Set->GetODBCFieldInfo(i,DbFi);
m_Lc.iSubItem=i;
m_Lc.fmt=LVCFMT_LEFT;
m_Lc.cx=DbFi.m_strName.GetLength()*10+100;
m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
GetListCtrl().InsertColumn(i,&m_Lc);?????????把列查进去了
}
..............第2段代码: LV_ITEM m_item;//条目结构体对象
CString string;//字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_Set->IsEOF())//记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_Set->MoveFirst();//从第一个记录开始
while(m_Set->IsEOF()==0)//是否到达最后一个记录
{
m_item.mask=LVIF_TEXT;
m_item.iItem=i;
m_item.iSubItem=0;
m_Set->GetFieldValue((short)0,string);
m_item.pszText=string.GetBuffer(string.GetLength());
m_List->InsertItem(&m_item);//?????????还插这个干什么?
//显示列数据
for(j=1;j<m_Set->m_nFields;j++)
{
m_Set->GetFieldValue((short)j,string);
m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_Set->MoveNext();//下移记录
i++;
}
问题:为什么还要insertitem函数干什么?下面的代码就是我所说的问题,程序可以运行,但是本人就是有点不明白,请各位大侠指点【用到一点ODBC数据库方面的知识】,如果有人想研究整个程序的代码,敬请联系,我可以给你发过去。第一段代码:
int i=0,j=0;
CODBCFieldInfo DbFi;//存储记录集字段信息的结构体
LV_COLUMN m_Lc;//存储列信息的结构体
m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM;//设置列属性
//读取记录集的字段信息
for(i=0;i<m_Set->m_nFields;i++)
{
m_Set->GetODBCFieldInfo(i,DbFi);
m_Lc.iSubItem=i;
m_Lc.fmt=LVCFMT_LEFT;
m_Lc.cx=DbFi.m_strName.GetLength()*10+100;
m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
GetListCtrl().InsertColumn(i,&m_Lc);?????????把列查进去了
}
..............第2段代码: LV_ITEM m_item;//条目结构体对象
CString string;//字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_Set->IsEOF())//记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_Set->MoveFirst();//从第一个记录开始
while(m_Set->IsEOF()==0)//是否到达最后一个记录
{
m_item.mask=LVIF_TEXT;
m_item.iItem=i;
m_item.iSubItem=0;
m_Set->GetFieldValue((short)0,string);
m_item.pszText=string.GetBuffer(string.GetLength());
m_List->InsertItem(&m_item);//?????????还插这个干什么?
//显示列数据
for(j=1;j<m_Set->m_nFields;j++)
{
m_Set->GetFieldValue((short)j,string);
m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_Set->MoveNext();//下移记录
i++;
}
InsertColumn插入星期几
InsertItem插入对应星期几的课程。。
你的意思时不时说,insertcolumn(列索引,列结构指针)是逐步插入列,
也就是:课程->星期1->星期2->星期3->...星期5。
而用insertitem插入的是:1->语文->数学-..>化学。
2->物理->化学->语文--->英语。
3->...那它与用insertitem插入项目有什么区别呢?
课程 星期1 星期2 星期3 星期4 星期5
----------------------------------------
1 语文 数学 英语 物理 化学
----------------------------------------
2 物理 化学 语文 数学 英语
----------------------------------------
3 数学 英语 物理 语文 化学
----------------------------------------
4 自习 计算机 美术 音乐 体育
----------------------------------------
5.....................................
----------------------------------------
InsertItem()是用来插入行的,如(excle中,我们想在某出插入一行信息,那么我们必须要选择插入,然后才增加一行信息),其实,如果InsertItem()内容为空时,就是相当与插入一个空行(列数就是有InsertColumn()觉得的),也可以认为是占位吧,告诉列表,这行位置是我的,不允许给别人了,除非把我删除.
SetItemText用来第2列开始的数据 数学 英语 物理 化学
总结一下,大家的意思是不是说insertcolumn()插入的仅仅是表格的头,
即:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而不是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列)
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................
而函数insertitem完成的
也不是:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而应是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................是不是这样的?
即:insertcolumn仅仅插入列的头。
而 insertitem所插入的仅仅是内容部分(以上述的表单为例)
但是又不完全正确,因为insertItem只能插入第0列的值,而其他值是没有办法插入的.
----------------------------------------
1 语文 数学 英语 物理 化学
----------------------------------------
2 物理 化学 语文 数学 英语
----------------------------------------
3 数学 英语 物理 语文 化学
----------------------------------------
4 自习 计算机 美术 音乐 体育
----------------------------------------
5.....................................
----------------------------------------大家的意思是不是说insertcolumn()插入的仅仅是表格的头,
即:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而不是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列)
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................
而函数insertitem完成的
也不是:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而应是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................是不是这样的?
即:insertcolumn仅仅插入列的头。
而 insertitem所插入的仅仅是内容部分(以上述的表单为例)
m_LIST.InsertColumn(1,"1",LVCFMT_CENTER,rect.Width()/5,-1);
m_LIST.InsertColumn(2,"2",LVCFMT_CENTER,rect.Width()/5,-1);
m_LIST.InsertColumn(3,"3",LVCFMT_CENTER,rect.Width()/5,-1);
m_LIST.InsertColumn(4,"4",LVCFMT_CENTER,rect.Width()/5,-1);
m__LIST.InsertColumn(5,"5",LVCFMT_LEFT,rect.Width()/5,-1);m_LIST.InsertItem(0,"星期1");
m_LIST.SetItemText(0,1,"语文");
m_LIST.SetItemText(0,2,"数学");
m_LIST.SetItemText(0,3,"英语");
m_LIST.SetItemText(0,4,"物理");
m_LIST.SetItemText(0,5,"化学");m_LIST.InsertItem(1,"星期2");
m_LIST.SetItemText(1,1,"物理");
m_LIST.SetItemText(1,2,"化学");
m_LIST.SetItemText(1,3,"语文");
m_LIST.SetItemText(1,4,"数学");
m_LIST.SetItemText(,5,"英语");依此类推
感谢leo_msdn()先生,能够诲人不倦,本人收益匪浅,在此再次表示衷心的感谢。
我的意思是:
1,在access中有如下数据,现需将其显示在列表中,但是我搞不清程序执行完第一段后,列表里得到的是什么?同时搞不清执行完第二段后(当然是假设在第一段没有执行时,单独执行第二段。如果先执行第一段,再执行第二段,肯定能得到正确结果),列表里得到的是什么?
2,access中的数据如下 课程 星期1 星期2 星期3 星期4 星期5
----------------------------------------
1 语文 数学 英语 物理 化学
----------------------------------------
2 物理 化学 语文 数学 英语
----------------------------------------
3 数学 英语 物理 语文 化学
----------------------------------------
4 自习 计算机 美术 音乐 体育
----------------------------------------
5.....................................
----------------------------------------3,第一段:
//设置:列对其方式,列宽度(像素),缓冲文本,列索引(序号)
m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM; //设置列属性
for(i=0;i<m_Set->m_nFields;i++)//m_nFields是CRecordset对象的成员变量
{
m_Set->GetODBCFieldInfo(i,DbFi); //用索引来查找字段 m_Lc.iSubItem=i; //LVCF_SUBITEM
m_Lc.fmt=LVCFMT_LEFT; //LVCF_FMT
m_Lc.cx=DbFi.m_strName.GetLength()*10+85; //LVCF_WIDTH
m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
//LVCF_TEXT
GetListCtrl().InsertColumn(i,&m_Lc);//CListView::GetListCtrl()
}
问:执行玩该段后,列表中插入的是什么?
the result is 课程 星期1 星期2 星期3 星期4 星期5 ????????????????????
or : 课程 星期1 星期2 星期3 星期4 星期5
----------------------------------------
1 语文 数学 英语 物理 化学
----------------------------------------
2 物理 化学 语文 数学 英语
----------------------------------------
3 数学 英语 物理 语文 化学
----------------------------------------
4 自习 计算机 美术 音乐 体育
----------------------------------------
5.....................................???????????????????????/*虚线仅方便视
---------------------------------------- 觉上的看*/
4, 第二段:
LV_ITEM m_item; //条目结构体对象
CString string; //字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_Set->IsEOF()) //记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_Set->MoveFirst(); //从第一个记录开始
while(m_Set->IsEOF()==0) //是否到达最后一个记录
{
m_item.mask=LVIF_TEXT; //指向存放项文本缓冲区
m_item.iItem=i; //从0开始的表的索引(行序号)
m_item.iSubItem=0; //从1开始编号的索引(列序号) m_Set->GetFieldValue((short)0,string);
m_item.pszText=string.GetBuffer(string.GetLength());
m_List->InsertItem(&m_item);//插入条目
/*该段所查入的有是什么数据???????????????????,最好回答问号处所提的问题,谢谢各位如此关爱啊!!!!!*/
//显示列数据
for(j=1;j<m_Set->m_nFields;j++)
{
m_Set->GetFieldValue((short)j,string);
m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_Set->MoveNext();//下移记录
i++;
}
即:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而不是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列)
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................
而函数insertitem完成的
也不是:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而应是:“1->语文->数学->英语->物理->化学(第一行)
"2->物理->化学->语文->数学->英语(第二行)
"3->数学->英语->物理->语文->化学(第三行)
"4->自习->计算机->美术->音乐->体育(第四行)
InsertColumn用来插入列标题 星期1 星期2 星期3 星期4 星期5InsertItem用来插入行 语文
SetItemText用来第2列开始的数据 数学 英语 物理 化学///////////////////////////
这个说的很明白了啊
假如m_listctrl为list的控制变量
//插入表的列头,这时还只是一个有列头的空表,没有一行记录
m_listctrl.InsertColumn(0,"课程",LVCFMT_CENTER,rect.Width()/5,-1);
m_listctrl.InsertColumn(1,"星期1",LVCFMT_CENTER,rect.Width()/5,-1);
m_listctrl.InsertColumn(2,"星期2",LVCFMT_CENTER,rect.Width()/5,-1);
m_listctrl.InsertColumn(3,"星期3",LVCFMT_CENTER,rect.Width()/5,-1);
m_listctrl.InsertColumn(4,"星期4",LVCFMT_CENTER,rect.Width()/5,-1);
m_listctrl.InsertColumn(5,"星期5",LVCFMT_LEFT,rect.Width()/5,-1);//插入第一行记录
m_listctrl.InsertItem(0,"1"); //表示要插入第一行记录,第一列数据为“1”
m_listctrl.SetItemText(0,1,"语文"); //第一行记录的第二列数据为“语文”
m_listctrl.SetItemText(0,2,"数学"); ...
m_listctrl.SetItemText(0,3,"英语");
m_listctrl.SetItemText(0,4,"物理");
m_listctrl.SetItemText(0,5,"化学");//插入第二行记录
m_listctrl.InsertItem(1,"2"); //表示要插入第二行记录,第一列数据为“2”
m_listctrl.SetItemText(1,1,"物理"); ...
m_listctrl.SetItemText(1,2,"化学");
m_listctrl.SetItemText(1,3,"语文");
m_listctrl.SetItemText(1,4,"数学");
m_listctrl.SetItemText(1,5,"英语");
//设置:列对其方式,列宽度(像素),缓冲文本,列索引(序号)
m_Lc.mask=LVCF_FMT|LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM; //设置列属性
for(i=0;i<m_Set->m_nFields;i++)//m_nFields是CRecordset对象的成员变量
{
m_Set->GetODBCFieldInfo(i,DbFi); //用索引来查找字段m_Lc.iSubItem=i; //LVCF_SUBITEM
m_Lc.fmt=LVCFMT_LEFT; //LVCF_FMT
m_Lc.cx=DbFi.m_strName.GetLength()*10+85; //LVCF_WIDTH
m_Lc.pszText=DbFi.m_strName.GetBuffer(DbFi.m_strName.GetLength());
//LVCF_TEXT
GetListCtrl().InsertColumn(i,&m_Lc);//CListView::GetListCtrl()
}
问:执行玩该段后,列表中插入的是什么?
the result is 课程 星期1 星期2 星期3 星期4 星期5
代码的意思是获取数据库中的字段名,将其表作为列标题,即 课程 星期1 星期2 星期3 星期4 星期5
4, 第二段:
LV_ITEM m_item; //条目结构体对象
CString string; //字符串临时变量
CDBVariant DbVariant;
i=0;
if(m_Set->IsEOF()) //记录集是否为空
{
AfxMessageBox("记录集没有记录");
return;
}
m_Set->MoveFirst(); //从第一个记录开始
while(m_Set->IsEOF()==0) //是否到达最后一个记录
{
m_item.mask=LVIF_TEXT; //指向存放项文本缓冲区
m_item.iItem=i; //从0开始的表的索引(行序号)
m_item.iSubItem=0; //从1开始编号的索引(列序号)m_Set->GetFieldValue((short)0,string);
m_item.pszText=string.GetBuffer(string.GetLength());
m_List->InsertItem(&m_item);//插入条目
/*该段所查入的有是什么数据???????????????????,最好回答问号处所提的问题,谢谢各位如此关爱啊!!!!!*/
//显示列数据
for(j=1;j<m_Set->m_nFields;j++)
{
m_Set->GetFieldValue((short)j,string);
m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));
}
m_Set->MoveNext();//下移记录
i++;}首先m_Set->MoveFirst();移到第一条记录,然后m_List->InsertItem(&m_item);插入"1",然后m_List->SetItemText(i,j,string.GetBuffer(string.GetLength()));插入 语文 数学 英语 物理 化学
最后i++,m_Set->MoveNext();数据库移至下一条记录,准备插入第2行,即 2 物理 化学 语文 数学 英语数据库到底时插入列表结束其实别人的代码知道意思就好,不要太抠,别人的方法不一定就适合你
比如我个人就不太喜欢上述的写法,太麻烦
多谢leo_msdn()君,能认识你真是太幸运了,准备接受分吧,你现在在哪里?如果再东莞长安的话,我想请你喝一杯,顺便给我当面指点指点。
明天见,Good night!!!!!!!!