请问,关于BCGGridCtrl使用的有关问题

请教,关于BCGGridCtrl使用的问题。

用派生了的CADOBCGGridCtrlEx,读取数据库数据,其中有一个字段是Bool型的,用CADOBCGGridCtrlEx显示总是出现内存地址错误,主要是在OnAddData函数中ReplaceItem的问题,请大家指教。附上主要代码:

//ADOBCGGridCtrlEx.h:文件

// ADOBCGGridCtrlEx.h: interface for the CADOBCGGridCtrlEx class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_ADOBCGGRIDCTRLEX_H__7A7E2B3A_CFA9_42D8_80BD_1D28A6A9BE51__INCLUDED_)
#define AFX_ADOBCGGRIDCTRLEX_H__7A7E2B3A_CFA9_42D8_80BD_1D28A6A9BE51__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "BCGPADOGridCtrl.h"
#include "BCGPGridRowEx.h"
#define BCGP_ADO_CHECK(x)    \
 {         \
 m_hresLastError = x;   \
 if (FAILED (m_hresLastError)) \
 return FALSE;    \
 }

#define BCGP_ADO_CHECK_UPDATE(x)  \
 {         \
 m_hresLastError = x;   \
 if (FAILED (m_hresLastError)) \
  {        \
  OnItemUpdateFailed();  \
  return;      \
  }        \
 }
class AFX_EXT_CLASS CADOBCGGridCtrlEx : public CBCGPADOGridCtrl 
{
public:
 void OnDestory();
 CBCGPGridRow* CreateVirtualRow (int nRow);
 BOOL CanSortByColumn (int nColumn);
 void OnItemUpdateFailed (_com_error& err);
 void OnItemUpdateFailed();
 void OnADOException (_com_error& err);
 void OnItemChanged (CBCGPGridItem* pItem, int nRow, int nColumn);
 BOOL OnAddData (CBCGPGridRow* pRow, int nColumn, int nRow);
 BOOL OpenSQL (LPCTSTR lpszSQL);
 BOOL OpenTable (LPCTSTR lpszTable);
 BOOL GetFieldList (CStringList& lstField);
 BOOL GetFieldList (LPCTSTR lpszTable, CStringList& lstField);
 BOOL GetTableList (CStringList& lstTable);
 BOOL Close ();
 BOOL OpenMSAccessFile (LPCTSTR lpszFileName,LPCTSTR lpszUserName = _T(""),LPCTSTR lpszPassword = _T(""),LPARAM  lOptions = 0);
 HRESULT GetLastError () const;
 BOOL OpenDB ( LPCTSTR lpszConnectionStr,LPCTSTR lpszUserName = _T(""),LPCTSTR lpszPassword = _T(""),LPARAM  lOptions = 0);

 CADOBCGGridCtrlEx();
 virtual ~CADOBCGGridCtrlEx();
protected:
 _ConnectionPtr m_pConnection;
 _RecordsetPtr m_pRecordSet;
 HRESULT   m_hresLastError;
protected:
 CString m_strSQL;  // Need to be set in derived classes in OpenSQL
 BOOL m_bDbSort;  // Use 'ORDER BY' for sorting
 BOOL m_bIsSorting; // Inside sorting mode

};

#endif // !defined(AFX_ADOBCGGRIDCTRLEX_H__7A7E2B3A_CFA9_42D8_80BD_1D28A6A9BE51__INCLUDED_)

 

 

//.cpp

// ADOBCGGridCtrlEx.cpp: implementation of the CADOBCGGridCtrlEx class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ADOBCGGridCtrlEx.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CADOBCGGridCtrlEx::CADOBCGGridCtrlEx()
{
 m_bDbSort = TRUE;
 m_bIsSorting = FALSE; 

}

CADOBCGGridCtrlEx::~CADOBCGGridCtrlEx()
{
 RemoveAll();

}

BOOL CADOBCGGridCtrlEx::OpenDB(LPCTSTR lpszConnectionStr, LPCTSTR lpszUserName, LPCTSTR lpszPassword,LPARAM  lOptions)
{
 m_hresLastError = S_OK;
 
 try
 {
  if (m_pConnection == NULL)
  {
   m_pConnection.CreateInstance (__uuidof (Connection));
  }
  
  if (m_pRecordSet == NULL)
  {
   m_pRecordSet.CreateInstance (__uuidof (Recordset));
  }
  
  Close ();
  
  BCGP_ADO_CHECK (m_pConnection->Open ( 
   _bstr_t (lpszConnectionStr),
   _bstr_t (lpszUserName),
   _bstr_t (lpszPassword),
   lOptions == 0 ? adModeUnknown : (long) lOptions));
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  
  OnADOException (err);
  return FALSE;
 }
 
 return TRUE;
}

HRESULT CADOBCGGridCtrlEx::GetLastError() const
{
 return m_hresLastError;
}

BOOL CADOBCGGridCtrlEx::OpenMSAccessFile(LPCTSTR lpszFileName, LPCTSTR lpszUserName, LPCTSTR lpszPassword,LPARAM  lOptions)
{
 ASSERT (lpszFileName != NULL);
 
 CString strConnect;
 strConnect.Format (_T("Provider=Microsoft.Jet.OLEDB.4.0; Data Source = %s"),
  lpszFileName);
 
 return OpenDB (strConnect, lpszUserName, lpszPassword, lOptions);
}

BOOL CADOBCGGridCtrlEx::Close()
{
 m_hresLastError = S_OK;
 
 RemoveAll ();
 DeleteAllColumns ();
 
 try
 {
  if (m_pRecordSet != NULL && m_pRecordSet->GetState () == adStateOpen)
  {
   BCGP_ADO_CHECK (m_pRecordSet->Close ());
  }
  
  if (m_pConnection != NULL && m_pConnection->GetState () == adStateOpen)
  {
   BCGP_ADO_CHECK (m_pConnection->Close ());
  }
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  
  OnADOException (err);
  return FALSE;
 }
 
 return TRUE;
}

BOOL CADOBCGGridCtrlEx::GetTableList(CStringList &lstTable)
{
 m_hresLastError = S_OK;
 
 lstTable.RemoveAll ();
 
 try
 {
  if (m_pConnection == NULL || m_pConnection->GetState () != adStateOpen)
  {
   ASSERT (FALSE);
   return FALSE;
  }
  
  _RecordsetPtr rsTables =
   m_pConnection->OpenSchema (adSchemaTables);
  
  while (!rsTables->ADOEOF)
  {
   CString strType =
    (LPCTSTR) (_bstr_t) rsTables->Fields->GetItem (TEXT("TABLE_TYPE"))->Value;
   
   if (strType == _T("TABLE"))
   {
    _bstr_t bstrTableName = rsTables->Fields->GetItem (TEXT("TABLE_NAME"))->Value;
    lstTable.AddTail ((LPCTSTR) bstrTableName);
   }
   
   BCGP_ADO_CHECK (rsTables->MoveNext ());
  }
  
  BCGP_ADO_CHECK (rsTables->Close ());
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  
  OnADOException (err);
  return FALSE;
 }
 
 return TRUE;
}

BOOL CADOBCGGridCtrlEx::GetFieldList(LPCTSTR lpszTable, CStringList &lstField)
{
 ASSERT (lpszTable != NULL);
 
 m_hresLastError = S_OK;
 
 CString strSQL = _T("SELECT * FROM ");
 strSQL += lpszTable;
 
 lstField.RemoveAll ();
 
 try
 {
  if (m_pConnection == NULL || m_pConnection->GetState () != adStateOpen)
  {
   ASSERT (FALSE);
   return FALSE;
  }
  
  _CommandPtr pCommand;
  pCommand.CreateInstance (__uuidof (Command));
  
  pCommand->ActiveConnection = m_pConnection;
  pCommand->CommandText = (LPCTSTR) strSQL;
  
  _RecordsetPtr pRecordSet (__uuidof (Recordset));
  
  pRecordSet->CursorLocation = adUseClient;
  
  BCGP_ADO_CHECK (pRecordSet->Open (
   (IDispatch*) pCommand, vtMissing,
   adOpenStatic, adLockUnspecified,
   adCmdUnknown));
  
  for (short i = 0; i < pRecordSet->Fields->Count; i++)
  {
   lstField.AddTail ((LPCTSTR)
    pRecordSet->Fields->GetItem (_variant_t (i))->GetName ());
  }
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  
  OnADOException (err);
  return FALSE;
 }
 
 return TRUE;
}

BOOL CADOBCGGridCtrlEx::GetFieldList(CStringList &lstField)
{
 lstField.RemoveAll ();
 
 m_hresLastError = S_OK;
 
 try
 {
  if (m_pRecordSet == NULL)
  {
   ASSERT (FALSE);
   return FALSE;
  }
  
  for (short i = 0; i < m_pRecordSet->Fields->Count; i++)
  {
   lstField.AddTail ((LPCTSTR)
    m_pRecordSet->Fields->GetItem (_variant_t (i))->GetName ());
  }
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  
  OnADOException (err);
  return FALSE;
 }
 
 return TRUE;
}

BOOL CADOBCGGridCtrlEx::OpenTable(LPCTSTR lpszTable)
{
 ASSERT (lpszTable != NULL);
 
 CString strSQL = _T("SELECT * FROM ");
 strSQL += lpszTable;
 
 return OpenSQL (strSQL);
}

BOOL CADOBCGGridCtrlEx::OpenSQL(LPCTSTR lpszSQL)
{
 ASSERT (lpszSQL != NULL);
 
 m_hresLastError = S_OK;
 m_strSQL.Empty ();
 
 RemoveAll ();
 
  if (!m_bIsSorting)
 {
  DeleteAllColumns ();
 }
 
 try
 {
  if (m_pConnection == NULL || m_pRecordSet == NULL ||
   m_pConnection->GetState () != adStateOpen)
  {
   ASSERT (FALSE);
   return FALSE;
  }
  
  if (m_pRecordSet->GetState () == adStateOpen)
  {
   m_pRecordSet->Close ();
  }
  
  _CommandPtr pCommand;
  pCommand.CreateInstance (__uuidof (Command));
  
  pCommand->ActiveConnection = m_pConnection;
  pCommand->CommandText = lpszSQL;
  
  m_pRecordSet->CursorLocation = adUseClient;
  
  BCGP_ADO_CHECK (m_pRecordSet->Open ((
   IDispatch*) pCommand, vtMissing,
   adOpenStatic, adLockBatchOptimistic,
   adCmdUnknown));
 
  int nColumns = 0;
  
   if (!m_bIsSorting)
   {
   //-------------
   // Add columns:
   //-------------
   CStringList lstField;
   if (!GetFieldList (lstField))
   {
    return FALSE;
   }
    
   int nColumn = 0;
   for (POSITION pos = lstField.GetHeadPosition (); pos != NULL; nColumn++)
   {
    InsertColumn (nColumn, lstField.GetNext (pos), 60);
   }
   
   nColumns = (int) lstField.GetCount ();
   
   }
   else
   {
    nColumns = GetColumnCount ();
   }
  
  if (nColumns == 0)
  {
   // No columns
   AdjustLayout ();
   return TRUE;
  }
  
  //-------------
  // Add records:
  //-------------
  if (m_pRecordSet->ADOEOF)
  {
   // The table is empty
   AdjustLayout ();
   return TRUE;
  }
  
  if (m_bVirtualMode)
  {
   while (!m_pRecordSet->ADOEOF)
   {
    m_pRecordSet->MoveNext ();
   }
   
   SetVirtualRows (max (0, (int)m_pRecordSet->GetRecordCount ()));
  }
  else
  {
   for (int nRow = 0; !m_pRecordSet->ADOEOF;
   m_pRecordSet->MoveNext (), nRow++)
   {
    CBCGPGridRow* pRow = (CBCGPGridRowEx*)CreateRow (nColumns);
    ASSERT_VALID (pRow);
    
    for (int nColumn = 0; nColumn < nColumns; nColumn++)
    {
     OnAddData (pRow, nColumn, nRow);
    }
    
    if (OnBeforeAddRow (pRow, nRow))
    {
     AddRow (pRow, FALSE);
    }
    else
    {
     delete pRow;
    }
   }
  }
  
  AdjustLayout ();
  }
  catch (_com_error& err)
  {
   m_hresLastError = err.Error ();
   
   OnADOException (err);
   return FALSE;
  }
  
  m_strSQL = lpszSQL;
  return TRUE;
}

BOOL CADOBCGGridCtrlEx::OnAddData(CBCGPGridRow *pRow, int nColumn, int nRow)
{
 ASSERT_VALID (pRow);
 ASSERT (m_pRecordSet != NULL);
 ASSERT (m_pRecordSet->GetState () == adStateOpen);
 ASSERT (!m_pRecordSet->ADOEOF);
 
 m_hresLastError = S_OK;  
 try
 {
  _variant_t varValue =
   m_pRecordSet->Fields->GetItem (_variant_t ((short) nColumn))->GetValue ();
  
  switch (varValue.vt)
  {
  case VT_DATE:
   pRow->ReplaceItem (nColumn, new CBCGPGridDateTimeItem ((DATE) varValue), FALSE, TRUE);
   break;
   
  case VT_BOOL:
   pRow->ReplaceItem (nColumn, new CBCGPGridCheckItem((bool) varValue), FALSE, TRUE);
//    if(varValue.vt == VT_BOOL)
//    {
//     CString str;
//     if((bool)varValue == TRUE)
//     {
//      str = "1";
//      pRow->GetItem (nColumn)->SetValue ((_variant_t)str, FALSE);
//     }
//     else
//     { str ="0";
//      pRow->GetItem(nColumn)->SetValue((_variant_t)str,FALSE);
//     }
//    }
   break;
  case VT_NULL:
  case VT_EMPTY:
   //--------------------------------------------------------------
   // Check the field type: if it's a string, pass an empty string:
   //--------------------------------------------------------------
   switch (m_pRecordSet->Fields->GetItem (
    _variant_t ((short) nColumn))->GetType ())
   {
   case adVarChar:
   case adLongVarChar:
   case adWChar:
   case adVarWChar:
   case adLongVarWChar:
    {
     pRow->GetItem (nColumn)->SetValue (_T(""), FALSE);
    }
   }
   break;
   case VT_BSTR:
    {
     CString str = (LPCTSTR)(_bstr_t) varValue;
     CString strTextToDisplay;
     CString strURL;
     if (ParseURLString (str, strTextToDisplay, strURL))
     {
      pRow->ReplaceItem (nColumn, new CBCGPGridURLItem (strTextToDisplay, strURL), FALSE, TRUE);
      break;
     }
    }
   default:
    pRow->GetItem (nColumn)->SetValue (varValue, FALSE);
  }
 }
 catch (CMemoryException* pEx)
 {
  pEx->ReportError ();
  pEx->Delete ();
 }
 catch (_com_error& err)
 {
  MessageBox (err.ErrorMessage ());
 }
 
 return TRUE;
}

void CADOBCGGridCtrlEx::OnItemChanged(CBCGPGridItem *pItem, int nRow, int nColumn)
{
 m_hresLastError = S_OK;
 
 try
 {
  ASSERT_VALID (this);
  
  if (m_pRecordSet == NULL)
  {
   ASSERT (FALSE);
   return;
  }
  
  ASSERT_VALID (pItem);
  
  CBCGPGridRow* pRow = pItem->GetParentRow ();
  if (pRow == NULL)
  {
   return;
  }
  
  ASSERT_VALID (pRow);
  
  BCGP_ADO_CHECK_UPDATE (m_pRecordSet->MoveFirst ());
  BCGP_ADO_CHECK_UPDATE (m_pRecordSet->Move (nRow));
  
  CString strURL;
  
  if (BuildURL (pItem, strURL))
  {
   m_pRecordSet->Fields->GetItem (_variant_t ((short) nColumn))->Value =
    (LPCTSTR) strURL;
  }
  else
  {
   m_pRecordSet->Fields->GetItem (_variant_t ((short) nColumn))->Value =
    pItem->GetValue ();
  }
  
  BCGP_ADO_CHECK_UPDATE (m_pRecordSet->Update ());
  BCGP_ADO_CHECK_UPDATE (m_pRecordSet->UpdateBatch (adAffectAll));
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  OnItemUpdateFailed (err);
 }
}

void CADOBCGGridCtrlEx::OnADOException(_com_error &err)
{
 AfxMessageBox (err.ErrorMessage ());
}

void CADOBCGGridCtrlEx::OnItemUpdateFailed()
{
 _com_error err (m_hresLastError);
 OnItemUpdateFailed (err);
}

void CADOBCGGridCtrlEx::OnItemUpdateFailed(_com_error &err)
{
 AfxMessageBox (err.ErrorMessage ());
 CBCGPDBGridCtrl::OnItemUpdateFailed ();
}

BOOL CADOBCGGridCtrlEx::CanSortByColumn(int nColumn)
{

 m_hresLastError = S_OK;
 
 try
 {
  if (m_pRecordSet == NULL)
  {
   ASSERT (FALSE);
   return FALSE;
  }
  
  switch (m_pRecordSet->Fields->GetItem (
   _variant_t ((short) nColumn))->GetType ())
  {
  case adTinyInt:
  case adSmallInt:
  case adInteger:
  case adBigInt:
  case adUnsignedTinyInt:
  case adUnsignedSmallInt:
  case adUnsignedInt:
  case adUnsignedBigInt:
  case adSingle:
  case adDouble:
  case adCurrency:
  case adDecimal:
  case adNumeric:
  case adBoolean:
  case adDate:
  case adDBDate:
  case adDBTime:
  case adDBTimeStamp:
  case adBSTR:
  case adChar:
  case adVarChar:
  case adLongVarChar:
  case adWChar:
  case adVarWChar:
  case adLongVarWChar:
   return TRUE;
  }
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  
  OnADOException (err);
 }
 
 return FALSE;
}

CBCGPGridRow* CADOBCGGridCtrlEx::CreateVirtualRow(int nRow)
{

 CBCGPGridRow* pRow = (CBCGPGridRow*)CBCGPGridCtrl::CreateVirtualRow (nRow);
 
 if (pRow == NULL)
 {
  return NULL;
 }
 
 if (m_pRecordSet == NULL)
 {
  ASSERT (FALSE);
  return NULL;
 }
  
 try
 {
  m_pRecordSet->MoveFirst ();
  m_pRecordSet->Move (nRow);
  
  for (int nCol = 0; nCol < GetColumnCount (); nCol++)
  {
   OnAddData (pRow, nCol, nRow);
  }
  
 }
 catch (_com_error& err)
 {
  m_hresLastError = err.Error ();
  
  OnADOException (err);
 }
 
 return pRow;
}

void CADOBCGGridCtrlEx::OnDestory()
{
 CBCGPGridCtrl::OnDestroy();
}

 

//对话框调用显示

#include "stdafx.h"
#include "大.h"
#include "TestADOGRID.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTestADOGRID dialog


CTestADOGRID::CTestADOGRID(CWnd* pParent /*=NULL*/)
 : CDialog(CTestADOGRID::IDD, pParent)
{
 //{{AFX_DATA_INIT(CTestADOGRID)
 //}}AFX_DATA_INIT
}


void CTestADOGRID::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CTestADOGRID)
 DDX_Control(pDX, IDC_ADO_GRID, m_pStatic);
 DDX_Control(pDX, IDC_ADO_GRID,m_adoGridCtrl);
 //}}AFX_DATA_MAP

}


BEGIN_MESSAGE_MAP(CTestADOGRID, CDialog)
 //{{AFX_MSG_MAP(CTestADOGRID)
 ON_WM_SIZE()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestADOGRID message handlers

BOOL CTestADOGRID::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 CreateADOGrid(IDC_ADO_GRID);
 ShowGrid("基础数据表");

//   CBCGPGridRow* pRow = m_adoGridCtrl.CreateNewRow ();
//   ASSERT_VALID (pRow);
//   
//  pRow->GetItem (1)->SetValue (_T("CheckBox:"));
//  pRow->ReplaceItem (1, new CBCGPGridCheckItem (TRUE));
//  pRow->GetItem (2)->SetValue (_T("CheckBox + Label:"));
//  CBCGPGridCheckItem* pCheckItem = new CBCGPGridCheckItem (TRUE);
//  pCheckItem->SetLabel(_T("Label"));
//  pRow->ReplaceItem (2, pCheckItem);
//  m_adoGridCtrl.AddRow (pRow, FALSE);
//  m_adoGridCtrl.AdjustLayout ();
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CTestADOGRID::CreateADOGrid(UINT nGridID)
{
 if (!m_adoGridCtrl.Create ( NULL,
  CRect (0, 0, 50, 50), this, nGridID))
 {
  TRACE0("CBCGPGridView::OnCreate: cannot create grid control\n");
  return FALSE;
 }
 
 CRect rc;
 GetClientRect (&rc);
 if (m_adoGridCtrl.GetSafeHwnd () != NULL)
 {
  m_adoGridCtrl.SetWindowPos (NULL, -1, -1, rc.Width (), rc.Height (),
   SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
 }
 
// m_adoGridCtrl.SetDbSort();
 CRect rect;
 m_pStatic.GetWindowRect (&rect);
 ScreenToClient(rect);
 m_adoGridCtrl.ShowWindow(SW_SHOW);
 m_adoGridCtrl.MoveWindow(&rect);
 m_pStatic.ShowWindow(SW_HIDE); 
 
 m_adoGridCtrl.EnableVirtualMode();
 
 return TRUE;
}

void CTestADOGRID::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);
 
 // TODO: Add your message handler code here
 
}

BOOL CTestADOGRID::ShowGrid(CString strTabName)
{
 if (strTabName.IsEmpty())
  return FALSE;
 
//  CString strDBName = "GWCInfo";
//  CString strHost ="(local)";
//  CString strConnect;
//  strConnect.Format("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=%s;Data Source=%s",
//   strDBName, strHost);
//  m_adoGridCtrl.OpenDB(strConnect,_T(""), _T(""),FALSE);
//  CString strSQL;
//  strSQL.Format("select * from %s", strTabName);
//  m_adoGridCtrl.OpenSQL(strSQL);
//  
//  CString  colName = m_adoGridCtrl.GetColumnName(0);
//  m_adoGridCtrl.SetColumnWidth(0, 60);
//  m_adoGridCtrl.SetColumnWidth(1,60);
//  m_adoGridCtrl.SetColumnWidth(2,60);
//  m_adoGridCtrl.SetDbSort(TRUE);


 CString strSQL = "select * from 地下水质量与污染层级阶梯评价标准";
 if (strSQL.IsEmpty())
  return FALSE;
 //读取评价标准
 CString m_strMdbName = "E:\\temp\\大\\Data\\update.apk"; //评价标准数据库连接
 CString m_strMdbConnect;
 m_strMdbConnect.Format( "Provider='Microsoft.JET.OLEDB.4.0';Data source = %s", m_strMdbName);

 if (m_adoGridCtrl.OpenDB(m_strMdbConnect,_T(""), _T(""),FALSE) == FALSE)//连接数据库失败
  return FALSE;
 
 if (m_adoGridCtrl.OpenSQL(strSQL) == FALSE)//打开数据集失败
  return FALSE;
 
 CString  colName = m_adoGridCtrl.GetColumnName(0);
 m_adoGridCtrl.SetColumnWidth(0, 60);
 m_adoGridCtrl.SetColumnWidth(1,60);
 m_adoGridCtrl.SetColumnWidth(2,60);
 m_adoGridCtrl.AdjustLayout();
 
 return FALSE;
}

 

#include "stdafx.h"
#include "大.h"
#include "TestADOGRID.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTestADOGRID dialog


CTestADOGRID::CTestADOGRID(CWnd* pParent /*=NULL*/)
 : CDialog(CTestADOGRID::IDD, pParent)
{
 //{{AFX_DATA_INIT(CTestADOGRID)
 //}}AFX_DATA_INIT
}


void CTestADOGRID::DoDataExchange(CDataExchange* pDX)
{
 CDialog::DoDataExchange(pDX);
 //{{AFX_DATA_MAP(CTestADOGRID)
 DDX_Control(pDX, IDC_ADO_GRID, m_pStatic);
 DDX_Control(pDX, IDC_ADO_GRID,m_adoGridCtrl);
 //}}AFX_DATA_MAP

}


BEGIN_MESSAGE_MAP(CTestADOGRID, CDialog)
 //{{AFX_MSG_MAP(CTestADOGRID)
 ON_WM_SIZE()
 //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestADOGRID message handlers

BOOL CTestADOGRID::OnInitDialog()
{
 CDialog::OnInitDialog();
 
 // TODO: Add extra initialization here
 CreateADOGrid(IDC_ADO_GRID);
 ShowGrid("基础数据表");

//   CBCGPGridRow* pRow = m_adoGridCtrl.CreateNewRow ();
//   ASSERT_VALID (pRow);
//   
//  pRow->GetItem (1)->SetValue (_T("CheckBox:"));
//  pRow->ReplaceItem (1, new CBCGPGridCheckItem (TRUE));
//  pRow->GetItem (2)->SetValue (_T("CheckBox + Label:"));
//  CBCGPGridCheckItem* pCheckItem = new CBCGPGridCheckItem (TRUE);
//  pCheckItem->SetLabel(_T("Label"));
//  pRow->ReplaceItem (2, pCheckItem);
//  m_adoGridCtrl.AddRow (pRow, FALSE);
//  m_adoGridCtrl.AdjustLayout ();
 return TRUE;  // return TRUE unless you set the focus to a control
               // EXCEPTION: OCX Property Pages should return FALSE
}

BOOL CTestADOGRID::CreateADOGrid(UINT nGridID)
{
 if (!m_adoGridCtrl.Create ( NULL,
  CRect (0, 0, 50, 50), this, nGridID))
 {
  TRACE0("CBCGPGridView::OnCreate: cannot create grid control\n");
  return FALSE;
 }
 
 CRect rc;
 GetClientRect (&rc);
 if (m_adoGridCtrl.GetSafeHwnd () != NULL)
 {
  m_adoGridCtrl.SetWindowPos (NULL, -1, -1, rc.Width (), rc.Height (),
   SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE);
 }
 
// m_adoGridCtrl.SetDbSort();
 CRect rect;
 m_pStatic.GetWindowRect (&rect);
 ScreenToClient(rect);
 m_adoGridCtrl.ShowWindow(SW_SHOW);
 m_adoGridCtrl.MoveWindow(&rect);
 m_pStatic.ShowWindow(SW_HIDE); 
 
 m_adoGridCtrl.EnableVirtualMode();
 
 return TRUE;
}

void CTestADOGRID::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);
 
 // TODO: Add your message handler code here
 
}

BOOL CTestADOGRID::ShowGrid(CString strTabName)
{
 if (strTabName.IsEmpty())
  return FALSE;
 
//  CString strDBName = "GWCInfo";
//  CString strHost ="(local)";
//  CString strConnect;
//  strConnect.Format("Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=%s;Data Source=%s",
//   strDBName, strHost);
//  m_adoGridCtrl.OpenDB(strConnect,_T(""), _T(""),FALSE);
//  CString strSQL;
//  strSQL.Format("select * from %s", strTabName);
//  m_adoGridCtrl.OpenSQL(strSQL);
//  
//  CString  colName = m_adoGridCtrl.GetColumnName(0);
//  m_adoGridCtrl.SetColumnWidth(0, 60);
//  m_adoGridCtrl.SetColumnWidth(1,60);
//  m_adoGridCtrl.SetColumnWidth(2,60);
//  m_adoGridCtrl.SetDbSort(TRUE);


 CString strSQL = "select * from 地下水质量与污染层级阶梯评价标准";
 if (strSQL.IsEmpty())
  return FALSE;
 //读取评价标准
 CString m_strMdbName = "E:\\temp\\大\\Data\\update.apk"; //评价标准数据库连接
 CString m_strMdbConnect;
 m_strMdbConnect.Format( "Provider='Microsoft.JET.OLEDB.4.0';Data source = %s", m_strMdbName);

 if (m_adoGridCtrl.OpenDB(m_strMdbConnect,_T(""), _T(""),FALSE) == FALSE)//连接数据库失败
  return FALSE;
 
 if (m_adoGridCtrl.OpenSQL(strSQL) == FALSE)//打开数据集失败
  return FALSE;
 
 CString  colName = m_adoGridCtrl.GetColumnName(0);
 m_adoGridCtrl.SetColumnWidth(0, 60);
 m_adoGridCtrl.SetColumnWidth(1,60);
 m_adoGridCtrl.SetColumnWidth(2,60);
 m_adoGridCtrl.AdjustLayout();
 
 return FALSE;
}