AccessDBのデータをリストビューに表示 – プログラミング – Home

AccessDBのデータをリストビュー...
 
通知
すべてクリア

[解決済] AccessDBのデータをリストビューに表示


こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

■動作環境      :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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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

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


返信引用
こまったちゃん
 こまったちゃん
(@こまったちゃん)
ゲスト
結合: 18年前
投稿: 39
Topic starter  

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++;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました