在列表控件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++;
    }

解决方案 »

  1.   

    一个是列,一个是行。。
    InsertColumn插入星期几
    InsertItem插入对应星期几的课程。。
      

  2.   

    JacksonFox(嘉木)君:
    你的意思时不时说,insertcolumn(列索引,列结构指针)是逐步插入列,
    也就是:课程->星期1->星期2->星期3->...星期5。
    而用insertitem插入的是:1->语文->数学-..>化学。
    2->物理->化学->语文--->英语。
    3->...那它与用insertitem插入项目有什么区别呢?
      课程  星期1  星期2  星期3  星期4  星期5
      ----------------------------------------
        1    语文   数学   英语   物理   化学
      ----------------------------------------
        2    物理   化学   语文   数学   英语
      ----------------------------------------
        3    数学   英语   物理   语文   化学  
      ----------------------------------------
        4    自习  计算机  美术   音乐   体育
      ----------------------------------------
        5.....................................
      ----------------------------------------
      

  3.   

    貌似insertcolumn是生成列(标题),但不能插入数据吧
      

  4.   

    InsertColumn()只能用来生成列表的头,即列表的列(如excle的表头信息,也既LZ的星期-\星期二....)而不能用来插入行信息.
    InsertItem()是用来插入行的,如(excle中,我们想在某出插入一行信息,那么我们必须要选择插入,然后才增加一行信息),其实,如果InsertItem()内容为空时,就是相当与插入一个空行(列数就是有InsertColumn()觉得的),也可以认为是占位吧,告诉列表,这行位置是我的,不允许给别人了,除非把我删除.
      

  5.   

    InsertColumn用来插入列标题      星期1  星期2  星期3  星期4  星期5InsertItem用来插入行            语文
     
    SetItemText用来第2列开始的数据         数学   英语   物理   化学
      

  6.   

    上述各位程序林高手:
        总结一下,大家的意思是不是说insertcolumn()插入的仅仅是表格的头,
    即:课程->星期1->星期2->星期3->星期4->星期5
    ------------------------------------------------------------------
    而不是:先插“课程->1->2->3...(第一列)
            然后“星期1->语文->物理->数学...(第二列)
            然后“星期2->数学->化学->英语...(第三列)
            然后“..................................
            ........................................
        而函数insertitem完成的
    也不是:课程->星期1->星期2->星期3->星期4->星期5
    ------------------------------------------------------------------
    而应是:先插“课程->1->2->3...(第一列)
            然后“星期1->语文->物理->数学...(第二列
            然后“星期2->数学->化学->英语...(第三列)
            然后“..................................
            ........................................是不是这样的?
    即:insertcolumn仅仅插入列的头。
    而 insertitem所插入的仅仅是内容部分(以上述的表单为例)
      

  7.   

    insertItem可以那样认为只插入内容部分,这个没有错.
    但是又不完全正确,因为insertItem只能插入第0列的值,而其他值是没有办法插入的.
      

  8.   

    我靠,到底是怎么插的,到底是不是像下面所说的方法执行的?例子所用的表  课程  星期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所插入的仅仅是内容部分(以上述的表单为例)
      

  9.   

    然后需要是用setitemtext()来修改其他列的值
      

  10.   

    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,"英语");依此类推
      

  11.   

    首先感谢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++;
    }
      

  12.   

    insertcolumn()插入的仅仅是表格的头,
    即:课程->星期1->星期2->星期3->星期4->星期5
    ------------------------------------------------------------------
    而不是:先插“课程->1->2->3...(第一列)
            然后“星期1->语文->物理->数学...(第二列)
            然后“星期2->数学->化学->英语...(第三列)
            然后“..................................
            ........................................
        而函数insertitem完成的
    也不是:课程->星期1->星期2->星期3->星期4->星期5
    ------------------------------------------------------------------
    而应是:“1->语文->数学->英语->物理->化学(第一行)
             "2->物理->化学->语文->数学->英语(第二行)
             "3->数学->英语->物理->语文->化学(第三行)  
             "4->自习->计算机->美术->音乐->体育(第四行)
      

  13.   

    leo_msdn():
    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,"英语");
      

  14.   

    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    物理   化学   语文   数学   英语数据库到底时插入列表结束其实别人的代码知道意思就好,不要太抠,别人的方法不一定就适合你
    比如我个人就不太喜欢上述的写法,太麻烦
      

  15.   

    leo_msdn() :
        多谢leo_msdn()君,能认识你真是太幸运了,准备接受分吧,你现在在哪里?如果再东莞长安的话,我想请你喝一杯,顺便给我当面指点指点。
    明天见,Good night!!!!!!!!