tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルコンボボックスの内容をコピーしたい
記事No2862
投稿日: 2006/01/11(Wed) 17:21
投稿者ひろ
[OSのVer]:WindowsXp  [VBのVer]:VB.NET2003

テーブル名の一覧を取得して (Oracle10g , ADO)
Form上のComboBox (cboTableA, cboTableB, cboTableC) に格納しようとしています。

rsWork.MoveFirst()     '取得したテーブル名一覧
Do While rsWork.EOF = False
    cboTableA.Items.Add(rsWork.Fields("TABLE_NAME").Value)
    cboTableB.Items.Add(rsWork.Fields("TABLE_NAME").Value)
    cboTableC.Items.Add(rsWork.Fields("TABLE_NAME").Value)
    rsWork.MoveNext()
Loop

上記で実現はできるのですが、自分的になんかすっきりしません。

ループの中では cboTableA にセットして、
最終的に内容を cboTableB, cboTableC にコピーできれば・・・と考えています。

.Items まで入力すると 入力候補の中に CopyTo があったので、調べてみました。
・・・が、ぴんと来ません。

<< Help の抜粋 >>
このメソッドを使用して、複数のコレクションの項目を 1 つの配列に結合できます。その後、この配
列を使用し、 ComboBox.ObjectCollection クラスの AddRange メソッドを使用して、別の ComboBox
コントロールの内容を代入できます。

この方法を取ってみようと考えたのです。

Dim objWork() As Object

cboTableA.Items.CopyTo(objWork, 0)
cboTableB.Items.AddRange(objWork)
cboTableC.Items.AddRange(objWork)

上記だと、「配列をNullにすることはできません。 dest 」のエラーが表示されます。

全く検討はずれな事をしているのでしょうか?
アドバイス頂けると助かります。

[ツリー表示へ]
タイトルRe: コンボボックスの内容をコピーしたい
記事No2863
投稿日: 2006/01/11(Wed) 22:27
投稿者なおこ(・∀・)
お世話になります。

配列の長さを指定してやればうまくいくとおもいます。

Me.ComboBox1.Items.Clear()
Me.ComboBox1.Items.Add("aaa")
Me.ComboBox1.Items.Add("bbb")
Me.ComboBox1.Items.Add("ccc")
Me.ComboBox1.Items.Add("ddd")

Dim collection As ComboBox.ObjectCollection = Me.ComboBox1.Items
Dim obj(collection.Count - 1) As Object

collection.CopyTo(obj, 0)
Me.ComboBox2.Items.AddRange(obj)

でも、ADO.NET(ODP.NET)で、
DataTable や DataSet を取得してバインドするほうが
ループする必要もないし、簡単だと思います。
手元に Oracle がないので検証してませんが、こんなかんじでしょうか。

Imports Oracle.DataAccess.Client

Dim con As OracleConnection = New OracleConnection(接続文字列)

Dim da As OlacleDataAdapter = New OlacleDataAdapter
Dim cmd As OlacleCommand = New OlacleCommand

cmd.Connection = con
cmd.CommandText = "SELECT TABLE_NAME FROM USER_TABLES"
da.SelectCommand = cmd

con.Open()
Dim dt As DataTable = New DataTable
da.Fill(dt)

cboTableA.DataSource = dt
cboTableA.DisplayMember = "TABLE_NAME"
cboTableB.DataSource = dt.Copy() '参照だけなら、Copy する必要も無いと思います。
cboTableB.DisplayMember = cboTableA.DisplayMember
cboTableC.DataSource = dt.Copy()
cboTableC.DisplayMember = cboTableA.DisplayMember

[ツリー表示へ]
タイトルRe^2: コンボボックスの内容をコピーしたい
記事No2864
投稿日: 2006/01/12(Thu) 09:35
投稿者ひろ
サンプルまで作成頂き、ありがとうございます。
配列の長さを確定させてから処理する必要があったのですね。

でも確かに後者の方法の方がスマートですね;
コピーの方法は俺.dllに入れておいて、今回は後者で実装してみようと思います。

本当にありがとうございました。

[ツリー表示へ]
タイトルRe^2: コンボボックスの内容をコピーしたい
記事No2866
投稿日: 2006/01/12(Thu) 10:41
投稿者ひろ
作成しました。
コンボボックスは未選択の状態が欲しいので空の行を追加してます。

con.Open()
dt = New DataTable
da.Fill(dt)

drNull = dt.NewRow
drNull("TABLE_NAME") = ""
dt.Rows.InsertAt(drNull, 0)

cboTableA.DataSource = dt
cboTableA.DisplayMember = "TABLE_NAME"
cboTableB.DataSource = dt.Copy
cboTableB.DisplayMember = cboTableA.DisplayMember
cboTableC.DataSource = dt.Copy
cboTableC.DisplayMember = cboTableA.DisplayMember

cboTableB , cboTableC の DataSource にセットする場所ですが、
なおこ(・∀・)さんのアドバイスで「参照だけならコピーする必要ない」との事だったので、
Copy を付けずに実装したのです。 ( ComboBox はテーブル選択の参照のみ )

実行して、cboTableA でデータを選択すると、その値が cboTableB , cboTableC にも
反映されてしまうので、参照のみですが Copy で実装しました。
それで解決できたようです。

[ツリー表示へ]