对话框中的CListCtrl……
单文档程序中,
用菜单命令弹出个对话框——定义为TsLsDlg类
对话框上有CListCtrl列表控件,定义为变量m_ListCtrl在对话框TsLsDlg类中我填写如下代码:
 
TsLsDlg::TsLsDlg(CWnd* pParent /*=NULL*/)
: CDialog(TsLsDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(TsLsDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
LV_COLUMN lvc;              //CListCtrl列结构
lvc.mask=LVCF_FMT | LVCF_WIDTH |LVCF_TEXT |LVCF_SUBITEM;  
lvc.fmt=LVCFMT_LEFT;
lvc.iSubItem=0;
lvc.pszText=(LPTSTR)_T("名称    ");
/*lvc.iSubItem=1;
lvc.pszText=(LPTSTR)_T("类型    ");
lvc.iSubItem=2;
lvc.pszText=(LPTSTR)_T("大小    ");
lvc.iSubItem=3;
lvc.pszText=(LPTSTR)_T("数量    ");
lvc.iSubItem=4;
lvc.pszText=(LPTSTR)_T("价格    ");*/
lvc.cx=80;
m_ListCtrl.InsertColumn(1,&lvc);   //赋值给列表控件m_ListCtrl
LV_ITEM lvit;           //CListCtrl行结构 lvit.mask=LVIF_TEXT;
lvit.iImage=0;
lvit.iItem=1;
lvit.iSubItem=0;
lvit.pszText=(LPTSTR)_T("行   1 ");
m_ListCtrl.SetItem(&lvit);    //赋值给列表控件m_ListCtrl}
在Doc类中,我这样调用对话框:
void CTsListCtrlDoc::OnListctrl() 
{
TsLsDlg mLsDlg;
mLsDlg.DoModal();

}编译,点击菜单,却不能显示对话框,更不要说正确显示CListCtrl控件了。请问……关于CListCtrl的代码哪里有错误,或是代码应该添加在哪个函数中?

解决方案 »

  1.   

    个人观点:
    首先你的初始化LIST放的位置不对,应该放到OnInitDialog里面(建议放在一个函数里面,然后再OnInitDialog里面调用);
      

  2.   

    你的列表框初始代码加错地方了。不能放在构造函数中。要放到对话框的OnInitDialog初始化函数中才可以。
      

  3.   

    在构造函数中,对话框中的各个控件都没有创建呢,所以你的m_ListCtrl.InsertColumn(1,&lvc);  语句肯定是不行的。
      

  4.   

    构造函数是在定义窗体变量时分配的,没有创建里面的窗体及控件对像,包括楼主的ListCtrl,在对像没有创建之前是不能操作的。
      

  5.   

    代码移到TsLsDlg::OnInitDialog()里面。
      

  6.   

    头文件中:
    protected:
    virtual BOOL OnInitDialog();BOOL TsLsDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    LV_COLUMN lvc;
    lvc.mask=LVCF_FMT | LVCF_WIDTH |LVCF_TEXT |LVCF_SUBITEM;
    lvc.fmt=LVCFMT_LEFT;
    lvc.iSubItem=0;
    lvc.pszText=(LPTSTR)_T("名称    ");
              lvc.cx=80;
    m_ListCtrl.InsertColumn(1,&lvc);   //赋值给列表控件m_ListCtrl
    LV_ITEM lvit;           //CListCtrl行结构 lvit.mask=LVIF_TEXT;
    lvit.iImage=0;
    lvit.iItem=1;
    lvit.iSubItem=0;
    lvit.pszText=(LPTSTR)_T("行   1 ");
    m_ListCtrl.SetItem(&lvit);    //赋值给列表控件m_ListCtrl}还是不行,同样的错误提示。我这是在文档视图程序中用弹出窗口,不是对话框程序。
    要给TsLsDlg添加虚函数的时候OnInitDialog()的时候,列表中根本没有!怎么回事啊,各位?
      

  7.   

    BOOL TsLsDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    //ASSERT((IDD_ABOUTBOX & 0xFFF0) == IDD_ABOUTBOX);
    // ASSERT(IDD_ABOUTBOX < 0xF000);

    m_ListCtrl.SetBkColor(RGB(0,0,0));
    m_ListCtrl.SetTextColor(RGB(250,250,255));
    m_ListCtrl.SetTextBkColor(RGB(0,0,0));
    LV_COLUMN lvc;
    lvc.mask=LVCF_FMT | LVCF_WIDTH |LVCF_TEXT |LVCF_SUBITEM|LVS_REPORT;
    lvc.fmt=LVCFMT_LEFT;
    lvc.iSubItem=0;
    lvc.pszText=(LPTSTR)_T(" 编号   ");
    lvc.cx=80;
    m_ListCtrl.InsertColumn(0,&lvc);
    lvc.iSubItem=1;
    lvc.pszText=(LPTSTR)_T("名称    ");
    lvc.cx=80;
    m_ListCtrl.InsertColumn(1,&lvc);
    lvc.iSubItem=2;
    lvc.pszText=(LPTSTR)_T("总额    ");
    lvc.cx=80;
    m_ListCtrl.InsertColumn(2,&lvc);
    lvc.iSubItem=3;
    lvc.pszText=(LPTSTR)_T("数量    ");
    lvc.cx=80;
    m_ListCtrl.InsertColumn(3,&lvc);
    lvc.iSubItem=4;
    lvc.pszText=(LPTSTR)_T("单价    ");
    lvc.cx=80;
    m_ListCtrl.InsertColumn(4,&lvc);
    LV_ITEM lvit;
        CString str;
    for(int i=0;i<30;i++)
    {
    str.Format("%d",i+1);
    m_ListCtrl.InsertItem(LVIF_TEXT|LVIF_STATE, i, 
    str, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED, 0, 0);
    m_ListCtrl.SetItemText(i,1,"天王白酒");
    m_ListCtrl.SetItemText(i,2,"¥10000.00");
    m_ListCtrl.SetItemText(i,3,"100箱");
    m_ListCtrl.SetItemText(i,4,"100");
    } LONG lStyle;

    lStyle=GetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE);//获取当前窗口类型

    lStyle&=~LVS_TYPEMASK; //清除显示方式位

    lStyle|=LVS_REPORT|LVS_EDITLABELS; //设置显示方式

    SetWindowLong(m_ListCtrl.m_hWnd,GWL_STYLE,lStyle);//设置窗口类型

    return TRUE;  // return TRUE  unless you set the focus to a control
    }这是我测试的结果。不过,只能够对第一列进行编辑,且编辑之后,数据马上还原……怎样对点击到的数据项进行编辑?(单击)且进行保存?