AccessDBのデータをリストビューに表示

[戻る]
こまったちゃん 2006/10/12(木) 14:00:17
■動作環境         :WindowsXP
■開発環境         :Visual C++6.0(ダイアログベース)
■データベース          :Access2000(ADO接続)

おせわになります。
ADOで接続してSQLを使いAccessのデータをリストビューに追加しています。
リストビューに追加されてはいるのですが、順番が逆になってしまいます。
これをAccessのデータベースの順番に表示したいのですが
方法がわかりません。どなたかご教授お願いします。

AccessDB
ID  |時間  |名前  |
-------------------------------------------
001 |10:00 |あああ|
002 |17:15 |いいい|
003 |11:30 |ううう|

<やりたい事>
リストビュー
ID  |時間  |名前  |
-------------------------------------------
001 |10:00 |あああ|
002 |17:15 |いいい|
003 |11:30 |ううう|

<現状>
リストビュー
ID  |時間  |名前
-------------------------------------------
003 |11:30 |ううう|
002 |17:15 |いいい|
001 |10:00 |あああ|


プログラム
※ SqlScript SQL文が入っています
※ pListV     リストビューのハンドルがセットされています
bool CAdoOperation::ListView(const CString SqlScript, CListView* pListV)
{
 // _bstr_t オブジェクトに文字列を代入します。
 _bstr_t bstrQuery(SqlScript);

 try
 {
  // SQL構文(SELECT 列名 FROM テーブル名 WHER 列名 = 条件)
  m_pRecordset = m_pConnect->Execute(bstrQuery, NULL, adCmdText);
    
  FieldsPtr pFields;
  FieldPtr  pField;

  // 対象となるデータがなくなるまでループ
  while (!m_pRecordset->GetadoEOF())
  {
    // データ取得
    for(int count = 0; count < list; count++ ){
     // int型 〜 long型に変換
     long Colum = count;

     pFields = m_pRecordset->Fields;
     pField  = pFields->Item[ Colum ];            
     _bstr_t value( pField->Value.bstrVal );

     // リストビューに追加
     CListCtrl &ctrl = pListV -> GetListCtrl();    // CListCtrlを取得
        if(count == 0){
         // 最初は一番左にアイテムをセット
         ctrl.InsertItem(count, value);// CListCtrlに対してInsert
        }
        else{
         // 2番目以降のカラムにセット
         ctrl.SetItemText( 0, count, value );
        }
    }                        
    // カーソルを次のレコードに移動
    m_pRecordset->MoveNext();
  }
  }
  catch ( _com_error& e )
 {
  AfxMessageBox(e.Description());
  return false;
 }
    return true;
}

Blue 2006/10/12(木) 14:18:13
InsertItemのヘルプはきちんとご覧になっていますか?
第一引数はどこに挿入するかを指定します。
よって、上記のコードではすべて先頭行に挿入しています。
(ctrl.SetItemText( 0, count, value );は明に先頭行に指定しているし)

RecordSetをループするときにカウンタを持てばいいようですが。

こまったちゃん 2006/10/12(木) 15:28:07
[[解決]]
Blueさんいつもありがとうございます。
ヘルプは見ていたのですが・・・
Blueさんのアドバイスで、勘違いと気づかなかった事が見えました。

<私の理解>
int InsertItem( int nItem, LPCTSTR lpszItem );
このパターンで nItemはリストビューの行の場所を指定していする。

>if(count == 0){
> ctrl.InsertItem(count, value)
>}
これだと常に0の時に InsertItem しているので 0行目に追加されていた。
冷静に考えれば当たり前の事に気づかなかった・・・

>ctrl.SetItemText( 0, count, value );
してたのは、InsertItemが常に先頭行に挿入されていたので、それに合わすために
第一引数に0を指定して先頭行を指定していました。

解決マークはチェックしておきますが
上記で間違った理解をしていましたらご指摘ください。

よろしくお願い致します。


下記のようにプログラムを修正しましたら期待通りになりました。
<修正プログラム>

int line = 0;        // リストビューに追加する行
while (!m_pRecordset->GetadoEOF())
{
 // データ取得
 for(int count = 0; count < list; count++ ){
  // int型 〜 long型に変換
  long Colum = count;

  pFields = m_pRecordset->Fields;
  pField  = pFields->Item[ Colum ];            
  _bstr_t value( pField->Value.bstrVal );

  // リストビューに追加
  CListCtrl &ctrl = pListV -> GetListCtrl();    // CListCtrlを取得
  if(count == 0){
   // 最初は一番左にアイテムをセット
   ctrl.InsertItem(line, value);    // CListCtrlに対してInsert
  }
  else{
   // 2番目以降のカラムにセット
   ctrl.SetItemText(line, count, value );
  }
 }                        
 // カーソルを次のレコードに移動
 m_pRecordset->MoveNext();
 line++;
}

古いスレッドには追加発言できません。