■動作環境 :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;
}
InsertItemのヘルプはきちんとご覧になっていますか?
第一引数はどこに挿入するかを指定します。
よって、上記のコードではすべて先頭行に挿入しています。
(ctrl.SetItemText( 0, count, value );は明に先頭行に指定しているし)
RecordSetをループするときにカウンタを持てばいいようですが。
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++;
}