请问列表控件中的insertcolumn与insertitem的作用有什么不同【附有几行代码搞不明白】

dding_inshili 2007-09-15 11:43:09
在列表控件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++;
}

...全文
1032 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
csyounth 2011-07-19
  • 打赏
  • 举报
回复
谢谢了,比较详细
dding_inshili 2007-09-18
  • 打赏
  • 举报
回复
只要好好干,馒头和牛奶总会有的...................呵呵
JacksonFox 2007-09-18
  • 打赏
  • 举报
回复
难道。。。我就没有分?哈哈。。。
忘记回来看看了。。。。
dding_inshili 2007-09-18
  • 打赏
  • 举报
回复
没关系,南京我有熟人和亲戚,让他们待我请你米西,米西...........你距离南师应该不远吧?如果方便的话我让别人约你
Leo_Panda 2007-09-18
  • 打赏
  • 举报
回复
谢谢你的好意,不过我住在南京,距离远了点
hahabaker 2007-09-17
  • 打赏
  • 举报
回复
insertcolumn()插入的仅仅是表格的头,
即:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而不是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列)
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................


而函数insertitem完成的
也不是:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而应是:“1->语文->数学->英语->物理->化学(第一行)
"2->物理->化学->语文->数学->英语(第二行)
"3->数学->英语->物理->语文->化学(第三行)
"4->自习->计算机->美术->音乐->体育(第四行)
dding_inshili 2007-09-17
  • 打赏
  • 举报
回复
leo_msdn() :
多谢leo_msdn()君,能认识你真是太幸运了,准备接受分吧,你现在在哪里?如果再东莞长安的话,我想请你喝一杯,顺便给我当面指点指点。
明天见,Good night!!!!!!!!
datoucaicai 2007-09-17
  • 打赏
  • 举报
回复
leo_msdn():
InsertColumn用来插入列标题 星期1 星期2 星期3 星期4 星期5

InsertItem用来插入行 语文

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,"英语");
Leo_Panda 2007-09-17
  • 打赏
  • 举报
回复
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
代码的意思是获取数据库中的字段名,将其表作为列标题,即 课程 星期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 物理 化学 语文 数学 英语

数据库到底时插入列表结束





其实别人的代码知道意思就好,不要太抠,别人的方法不一定就适合你
比如我个人就不太喜欢上述的写法,太麻烦
dding_inshili 2007-09-16
  • 打赏
  • 举报
回复
上述各位程序林高手:
总结一下,大家的意思是不是说insertcolumn()插入的仅仅是表格的头,
即:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而不是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列)
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................


而函数insertitem完成的
也不是:课程->星期1->星期2->星期3->星期4->星期5
------------------------------------------------------------------
而应是:先插“课程->1->2->3...(第一列)
然后“星期1->语文->物理->数学...(第二列
然后“星期2->数学->化学->英语...(第三列)
然后“..................................
........................................

是不是这样的?
即:insertcolumn仅仅插入列的头。
而 insertitem所插入的仅仅是内容部分(以上述的表单为例)
Leo_Panda 2007-09-16
  • 打赏
  • 举报
回复
InsertColumn用来插入列标题 星期1 星期2 星期3 星期4 星期5

InsertItem用来插入行 语文

SetItemText用来第2列开始的数据 数学 英语 物理 化学
xiaoQ008 2007-09-16
  • 打赏
  • 举报
回复
2楼正解

1个是列 像课程 星期1 星期2 星期3 星期4 星期5

一个是行
51touch 2007-09-16
  • 打赏
  • 举报
回复
我觉得楼主完全可以自己弄一个简单的例子程序,实验一下就非常清楚了。
dding_inshili 2007-09-16
  • 打赏
  • 举报
回复
首先感谢leo_msdn():
感谢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++;


}



shanhqk 2007-09-16
  • 打赏
  • 举报
回复
InsertColumn()只能用来生成列表的头,即列表的列(如excle的表头信息,也既LZ的星期-\星期二....)而不能用来插入行信息.
InsertItem()是用来插入行的,如(excle中,我们想在某出插入一行信息,那么我们必须要选择插入,然后才增加一行信息),其实,如果InsertItem()内容为空时,就是相当与插入一个空行(列数就是有InsertColumn()觉得的),也可以认为是占位吧,告诉列表,这行位置是我的,不允许给别人了,除非把我删除.
mayudong1 2007-09-16
  • 打赏
  • 举报
回复
貌似insertcolumn是生成列(标题),但不能插入数据吧
dding_inshili 2007-09-16
  • 打赏
  • 举报
回复
JacksonFox(嘉木)君:
你的意思时不时说,insertcolumn(列索引,列结构指针)是逐步插入列,
也就是:课程->星期1->星期2->星期3->...星期5。
而用insertitem插入的是:1->语文->数学-..>化学。
2->物理->化学->语文--->英语。
3->...那它与用insertitem插入项目有什么区别呢?


课程 星期1 星期2 星期3 星期4 星期5
----------------------------------------
1 语文 数学 英语 物理 化学
----------------------------------------
2 物理 化学 语文 数学 英语
----------------------------------------
3 数学 英语 物理 语文 化学
----------------------------------------
4 自习 计算机 美术 音乐 体育
----------------------------------------
5.....................................
----------------------------------------
Leo_Panda 2007-09-16
  • 打赏
  • 举报
回复
m_LIST.InsertColumn(0,"课程",LVCFMT_CENTER,rect.Width()/5,-1);
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,"英语");

依此类推
shanhqk 2007-09-16
  • 打赏
  • 举报
回复
然后需要是用setitemtext()来修改其他列的值
dding_inshili 2007-09-16
  • 打赏
  • 举报
回复
我靠,到底是怎么插的,到底是不是像下面所说的方法执行的?

例子所用的表

课程 星期1 星期2 星期3 星期4 星期5
----------------------------------------
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所插入的仅仅是内容部分(以上述的表单为例)
加载更多回复(2)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧