リストボックスのデータソースを設定するには

解決


たっきい  2004-03-21 21:41:44  No: 112453  IP: [192.*.*.*]

こんにちは。vb6、xpHOMEです。ADOを使ってデータベースにアクセスし、リストボックスに内容を表示させたいと思います。表示させるだけなら「List1.Add」でできますが、開発しているのが社員情報のデータベースインターフェイスなので、「次へ」ボタンをクリックすると情報が更新されるようにしたいのです。「次へ」のイベントが発生する時にリストボックスの内容をリセットしてAddしなおせばいいのですが、リストボックスのプロパティにデータベースに連結できそうなものがあり、もっとスマートな方法があるのかと思います。(自分でデータソースを設定しようとしてもできませんでした。)ご存知の方がいらっしゃいましたらぜひご教授願います。

編集 削除
SINITIROU  2004-03-22 10:20:59  No: 112454  IP: [192.*.*.*]

改行してください.
読みにくいです.

編集 削除
いな  2004-03-22 10:46:32  No: 112455  IP: [192.*.*.*]

問題点の切り分け:
>1.リストボックスに内容を表示させたいと思います。
>2.「次へ」ボタンをクリックすると情報が更新されるようにしたいのです。
>3.リストボックスのプロパティにデータベースに連結できそうなものがあり、もっとスマートな方法があるのかと思います

1、2は伝わりますが、3は何を言ってるのか第3者に伝わりません。

編集 削除
たっきい  2004-03-22 12:52:21  No: 112456  IP: [192.*.*.*]

SINITIROU様、いな様、
意味のわかりにくい長い質問ですみませんn(_ _)n
最初からコードを貼って説明すればよかったのですが
今一度お願いします。

List1.DataSource 
List1.DataField 

ADOで接続した後リストボックスにある上のふたつの
プロパティに、

List1.DataSource = テーブル名
List1.DataField = フィールド名

このような感じで設定すると、MoveNextおよびPrevious
時にリストボックスの内容が自動で更新できるようにな
ればとおもっています。(テキストボックスでの連結は
できました。)
自分が設定した祭には、接続のエラーは出ませんでした。
しかしリストボックスは空白のままで、MoveNextでもPrevious
でも何の変化もありません。
このプロパティを利用して思うような動作は可能なのでしょうか。
よろしくお願いします。

編集 削除
魔界の仮面弁士  2004-03-22 13:08:53  No: 112457  IP: [192.*.*.*]

ListBoxへの連結は、
  「ListBoxに表示されている内容のうち、どれが選択されているか」
を示す物となります。
つまり、表示される項目に関しては、自分で登録しておく必要があるわけです。

一覧まで自動で生成させたい場合には、ListBoxの替わりにDataListコントロールを使ってみてください。

編集 削除
たっきい  2004-03-22 14:10:37  No: 112458  IP: [192.*.*.*]

魔界の仮面弁士様ありがとうございます。
ご指摘いただいたとおり早速Datalistコントロール
を貼り付けてはみたものの、データを連結
する方法があいまいなのです。
http://support.microsoft.com/default.aspx?scid=kb;JA;189682
上のMSDNのヘルプを見ても意味がよく理解できないのです。

例えば
Set DataList1.DataSource = レコードセット名
DataList1.DataField = ("フィールド名")

こんな感じで連結できるとてっきり思って
ましたが、実際やってみると普通のリストボックス
同様に空白のDatalistボックスがたたずんでるだけです。
何とかして自分で調べるのが筋なのですが検索
してみたところヒット数があまりにも少なかった
ので、もしご存知でしたらデータ連結方法も
含めてご教授いただけると大変ありがたいです。
よろしくお願い致します  n(_  _)n

編集 削除
魔界の仮面弁士  2004-03-22 16:02:32  No: 112459  IP: [192.*.*.*]

MSDNライブラリのチュートリアルは試されましたか?

Northwind.mdb ( または NWIND.MDB ) を使って、
実際にDataList/DataComboに項目を表示させるまでの
具体的な手順が書かれていますので、参考になると思いますよ。

[Visual Studio 6.0 ドキュメント]
└[Visual Basic ドキュメント]
  └[Visual Basic の使用方法]
    └[プログラミング ガイド]
      └[Visual Basic を使ってできること]
        └[Visual Basic の標準コントロールの使用]
          └[データ コンボ コントロールおよびデータ リスト コントロールの使用]
            ├[データ コンボ コントロールとデータ リスト コントロールを使用した 2 つのテーブルのリンク]
            └[簡単なデータ コンボ アプリケーションの作成]

もしもまだ読まれていないのであれば、付属の mdb ファイルを使って、
上記を実際に試してみる事をお奨めします。


http://support.microsoft.com/default.aspx?scid=kb;JA;189682
> 上のMSDNのヘルプを見ても意味がよく理解できないのです。

DataListには、データソースを指定するプロパティが2種類あり、
そして、フィールドを指定するプロパティが3つあるのです。
上記 KB 189682 では、これら5つのプロパティについて記載されています。

以下に、これら5つのプロパティについての
簡単な概要(といっても長文ですが…)を、私なりに記して
おきますが、できれば、お手持ちのヘルプ(MSDNライブラリ)で、
これらの5つのプロパティについて調べてみてください。

-------------
先の回答でも少し書いたのですが、データソースには
  「リストに項目を表示させるためのデータソース」
  「リストの項目を選択させるためのデータソース」
があります。(項目表示に使われるマスタは、前者のプロパティを使います)


KB 189682 の例では、
》 例として、EmployeeID というフィールドを持つ Orders テーブルの
》 場合を考えてみましょう。さらに社員情報を社員名ではなく、この
》 EmployeeID フィールドを使って選択できるようする場合を考えてみます。 
という事例がありましたので、これを言い換えて説明しますね。

まず、手元に 2つのテーブルがあると考えてください。
  ・DataList項目のマスタとなる『注文』テーブル
  ・DataListの選択状態を示す『社員』マスタ
どちらのテーブルにも、『社員ID』というフィールドがあります。

そして、[社員ID] は、[社員マスタ] の主キーとなっています。

この場合、
   DataSource  → 『注文』テーブル
   DataField   → (注文テーブルの)『社員ID』フィールド
   RowSource   → 『社員』マスタ
   ListField   → (社員マスタの)『社員ID』フィールド
のように設定することができます。


もし、DataListに「社員ID」ではなく、「社員名」を表示させたいなら、
   BoundColumn → (社員マスタの)『社員ID』フィールド
   ListField   → (社員マスタの)『社員名』フィールド
のように設定する事もできます。
この場合、画面上は「社員名」が表示されていますが、
実際に更新されるのは「(注文テーブルの)社員ID」です。

また、「リストに項目を表示させる」事が目的であって、
他方の「リストの項目を選択させる」というのは不要な場合には、
DataSource / DataFieldの指定を省略する事ができます。


……逆にいうと、「リストに項目が表示されていない」状態では、
「リストの項目を選択する」という事はできませんよね。
つまり、DataSource / DataFiled だけを設定するという事は
無意味というわけです。

ここまでが理解できれば、

> 例えば
> Set DataList1.DataSource = レコードセット名
> DataList1.DataField = ("フィールド名")
> こんな感じで連結できるとてっきり思って

とだけ設定しても、望むべき結果が得られなかった理由もわかるかと思います。

編集 削除
魔界の仮面弁士  2004-03-22 16:05:13  No: 112460  IP: [192.*.*.*]

あちゃ、逆に書いてしまいました。m(_ _)m

誤)
>  ・DataList項目のマスタとなる『注文』テーブル
>  ・DataListの選択状態を示す『社員』マスタ

正)
  ・DataList項目のマスタとなる『社員』マスタ
  ・DataListの選択状態を示す『注文』テーブル

編集 削除
たっきい  2004-03-23 11:01:19  No: 112461  IP: [192.*.*.*]

魔界の仮面弁士様、丁寧にな説明で大変感動しております。
昨日からいろいろ調べてやってみて、社員マスタから氏名
を抜き出して表示させるという本来の目的を達成することが
できました。ありがとうございます。
これを応用して階層化レコードセットの子レコードセットを
表示させるように試みてはみたものの、つまずいております。
まずはコードを貼ります。

   ' 階層化Recordsetオブジェクトを作成
    mySQL = "SHAPE {SELECT * FROM t_syainmasta} " _
          & "APPEND ({SELECT * " _
          & "FROM t_kazokukousei} AS kazokukousei" _
          & "RELATE syainid TO syainid)"
          
    Set rs = New ADODB.Recordset
    rs.Open mySQL, cn
  
    ' 子レコードセットを作成
    Set rsSub = New ADODB.Recordset
    Set rsSub = rs.Fields("kazokukousei").Value

-----------------------------------------------------
テーブル構成
    t_syainmasta
        syainid
        氏名
        (以下略)

    t_kazokukousei
        syainid
        家族氏名
        誕生日
        (以下略)
  
-----------------------------------------------------------

社員の家族構成を内容としたテーブル「t_kazokukousei」を
社員マスタテーブルにsyainidでリレーションを設定しています。
やりたいことは、MovePreviousまたはNext時にDatalistボックスに
その社員の家族名一覧が表示されるようにしたいです。
魔界の仮面弁士様から教えていただいたデータを扱う5つのプロパティ
をいろいろ入れ替えてみたのですが、リストには全社員分の家族
の名前が表示されます。やりたいことはDatagridコントロールで
可能ということはわかるのですが、ユーザーに「選択させる」ので
リストボックスにしたいのです。
何度もお手を煩わせるようで恐れ入りますが、もし不可能ならDatagrid
とリストボックスを組み合わせて使ってなんとかやりますのでDatalist
ボックスのみで可能かどうかだけで結構ですのでちょっと見ていただけ
たら幸いです。お願いします  n(_  _)n

編集 削除
魔界の仮面弁士  2004-03-23 22:14:27  No: 112462  IP: [192.*.*.*]

> リストには全社員分の家族の名前が表示されます。
多分 DataList では、IRowsetInfo.GetReferencedRowset や
IParentRowset.GetChildRowset などを処理できないのでしょう。

> Datalistボックスのみで可能かどうかだけで結構ですので
> ちょっと見ていただけたら幸いです。
DataListって、ほとんど使った事が無いので、
「可能かどうかのチェック」に手間取ってしまいました。(^_^;)

で。下記のようなサンプルを作って試してみましたが……おそらく、
DataListは階層型レコードソースに対応していないのだと思います。
DataGridやMSHFlexGridだと、大丈夫なのですけれどね。

http://www.ocv.ne.jp/~oratorio/junk/Sample/31/Sample31.lzh

編集 削除
たっきい  2004-03-24 10:25:10  No: 112463  IP: [192.*.*.*]

魔界の仮面弁士様、サンプルまで作っていただいて
本当に恐縮です。すごくわかりやすいです。やっぱり
Datalistは階層化レコードソースに対応してなかった
んですね。(>_<”)次の手を考える事さえも魔界の
仮面弁士様にしてもらってしまってなんとお礼を言って
良いのやらで・・・。(゜o゜)

サンプルの中で自分にとって新しい収穫が二つありまし
た。ひとつはADOのStreamオブジェクトです。下のURLでチェック
しました。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpado260/htm/mdmthrstsave.asp

二つ目はレコードセット宣言のときにイベント
も同時にやってしまうことです。強力な武器を2つも教えて
いただいた感じでとっても強くなった気がします。

おかげさまでで当初の目的をすべて果たすことができました。
これからも何度かお世話になると思いますが、どうぞよろしく
お願いいたします。(⌒_⌒)

編集 削除