如题

解决方案 »

  1.   

    listbox中没有阴影条??
    什么意思?不懂!
      

  2.   

    就是为什么在打开表以后listbox中没有显示。
      

  3.   

    VC不能像VB那样可以自动显示记录,必须在View类的初始化中将数据库表的个字段添加成各列,然后就应该可以实现了,如果想保持数据类型,还得调用View类的OnGetDispInfo()函数,在其中进行修改
      

  4.   

    我添加了,也调用了OnGetDispInfo()啊:
    #include "stdafx.h"
    #include "DEFENDER.h"
    #include "DEFENDERDoc.h"
    #include "DEFENDERView.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CDEFENDERViewIMPLEMENT_DYNCREATE(CDEFENDERView, CListView)BEGIN_MESSAGE_MAP(CDEFENDERView, CListView)
    //{{AFX_MSG_MAP(CDEFENDERView)
    ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CDEFENDERView construction/destructionCDEFENDERView::CDEFENDERView()
    {
    // TODO: add construction code here}CDEFENDERView::~CDEFENDERView()
    {
    }BOOL CDEFENDERView::PreCreateWindow(CREATESTRUCT& cs)
    {
    // TODO: Modify the Window class or styles here by modifying
    //  the CREATESTRUCT cs
    cs.lpszName = WC_LISTVIEW;
    cs.style &= ~LVS_TYPEMASK;
    cs.style |=LVS_REPORT;
    cs.style |=LVS_OWNERDATA;
    return CView::PreCreateWindow(cs);
    }/////////////////////////////////////////////////////////////////////////////
    // CDEFENDERView drawingvoid CDEFENDERView::OnDraw(CDC* pDC)
    {
    CDEFENDERDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    }void CDEFENDERView::OnInitialUpdate()
    {
    CListView::OnInitialUpdate();

    // TODO: Add your specialized code here and/or call the base class
    /*SET NUMBER OF ITEMS IN LIST TO NUMBER OF ITEMS IN recordset*/
    /*CREAte image list*/
    CDaoRecordset* pRecordSet = GetRecordSet();
    if(pRecordSet != NULL)
    {
    m_pImageList = new CImageList();
    m_pImageList->Create(/*IDB_IMAGELIST*/8,16,1,RGB(0,0,0));
    //设置扩展风格 GetListCtrl().SetImageList(m_pImageList,LVSIL_SMALL);
    DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES  |
    /*LVS_EX_SUBITEMIMAGES | */ LVS_EX_HEADERDRAGDROP | 
    LVS_EX_TRACKSELECT;
    GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,0,
    LPARAM(dwExStyle));
    LV_COLUMN lvColumn;
    lvColumn.fmt = LVCFMT_LEFT; lvColumn.cx = 120;
    int pp=pRecordSet->GetFieldCount();
    char  oo=pp;

    AfxMessageBox(oo);
    for(int i = 0; i<pRecordSet->GetFieldCount();i++)//设置列
    {
    CDaoFieldInfo m_fieldinfo;
    pRecordSet->GetFieldInfo(i,m_fieldinfo);//获取字段名
    int len =m_fieldinfo.m_strName.GetLength();
    CString temp = m_fieldinfo.m_strName;
    TCHAR* szBuffer = new TCHAR[len +1 ];
    strcpy(szBuffer,temp.GetBuffer(len));
    temp.ReleaseBuffer();
    lvColumn.pszText = szBuffer;
    GetListCtrl().InsertColumn(i, &lvColumn);//插入列
    delete szBuffer;
    }
    //设置ListView中的项数
    long count = GetRecordCount();//获取记录数
    GetListCtrl().SendMessage(LVM_SETITEMCOUNT,(WPARAM)count,
    (LPARAM)LVSICF_NOINVALIDATEALL);
    }
    }/////////////////////////////////////////////////////////////////////////////
    // CDEFENDERView diagnostics#ifdef _DEBUG
    void CDEFENDERView::AssertValid() const
    {
    CListView::AssertValid();
    }void CDEFENDERView::Dump(CDumpContext& dc) const
    {
    CListView::Dump(dc);
    }CDEFENDERDoc* CDEFENDERView::GetDocument() // non-debug version is inline
    {
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDEFENDERDoc)));
    return (CDEFENDERDoc*)m_pDocument;
    }
    #endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
    // CDEFENDERView message handlersvoid CDEFENDERView::OnGetdispinfo(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    TCHAR szValue[MAX_PATH];
    szValue[0] = '\0';
    CDaoRecordset* pRecordSet = GetRecordSet();
    if(!pRecordSet)
    return;
    COleVariant varValue;
    long index = pDispInfo->item.iItem;
    long subItem = pDispInfo->item.iSubItem;

    if(pDispInfo->item.mask & LVIF_TEXT)
    {
    try
    {
    pRecordSet->SetAbsolutePosition(index);
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription,
    MB_ICONEXCLAMATION);
    e->Delete();
    return;
    }
    try
    {
    if(subItem)
    pRecordSet->GetFieldValue(subItem,varValue);
    else
    pRecordSet->GetFieldValue(0,varValue);
    }
    catch(CDaoException* e)
    {
    AfxMessageBox(e->m_pErrorInfo->m_strDescription,
    MB_ICONEXCLAMATION);
    e->Delete();
    return;
    } const VARIANT* variant = LPCVARIANT(varValue); if(variant->vt & VT_BYREF)
    return;
    switch(variant->vt)
    {
    case VT_ERROR:{
    strcpy(szValue,"Error");
    break;
      }
    case VT_I2:{
    wsprintf(szValue,"%d",variant->iVal);
    break;
       }
    case VT_I4:{
    wsprintf(szValue,"%f",variant->fltVal);
    break;
       }
    case VT_R8:{
    wsprintf(szValue,"%f",variant->dblVal);
    break;
       }
    case VT_CY:{
    COleCurrency c(varValue);
    CString s = c.Format();
    strcpy(szValue,s.GetBuffer(s.GetLength()));
    s.ReleaseBuffer();
    break;
       }
    case VT_DATE:{
    COleDateTime t(variant->date);
    CString s = t.Format("%B %d,%Y" );
    strcpy(szValue,s.GetBuffer(s.GetLength()));
    s.ReleaseBuffer();
    break;
       }
    case VT_BSTRT :{
    CString str = V_BSTRT( &varValue );
    strcpy(szValue,str.GetBuffer(str.GetLength()));
    str.ReleaseBuffer();
    break;
       }
    case VT_BOOL:{
    if(variant->boolVal)
    strcpy(szValue,"TRUE");
    else
    strcpy(szValue,"FALSE");
    break;
     }
    case VT_UI1:{
    strcpy(szValue,(char*)variant->bVal);
    break;
       }
    default:{
    szValue[0] = '\0';
    break;
    }
    }
    //设置项文本
    lstrcpyn(pDispInfo->item.pszText,szValue,
    pDispInfo->item.cchTextMax);
    }
    if(pDispInfo->item.mask & LVIF_IMAGE)
    pDispInfo->item.iImage =0;//在列表中的第一项设置图象 *pResult = 0;
    /*LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
    // TODO: Add your control notification handler code here

    *pResult = 0;*/
    }long CDEFENDERView::GetRecordCount()
    {
    CDaoRecordset* pRecordset=GetRecordSet();
    if(pRecordset)
    return pRecordset->GetRecordCount();
    return 0;}CDaoRecordset* CDEFENDERView::GetRecordSet()
    {
    return GetDocument()->GetRecordSet();}
      

  5.   

    是listCtrl吧?你是做虚拟列表吧?msdn中有个dbv_list的程序可以参考一下。