DOBON.NET DOBON.NETプログラミング掲示板過去ログ

vb.net コンボボックスにデータをセットしたい

環境/言語:[WindowsXP VB.NET]
分類:[.NET]

お世話になります。

SQLserverからテーブルを読み込んで、複数あるコンボボックスにそれぞれデータをセットしようとしています。
現在は、フォームからコンボボックスのプロパティでDisplayMember、ValueMemberを書いて、
コードで
Public Sub SetComboItem(ByVal Combo_Name As ComboBox, ByVal Table_Name As String)
    Dim table As DataTable

    table = ReturnTable("SELECT * FROM " & Table_Name & " ORDER BY " & Me.DisplayMember)
    Me.DataSource = table
    Me.SelectedIndex = -1
End Sub
としています。(ReturnTableはsql文を読み込み、データテーブルにデータをセットして返す関数です)

この方法でも動くのですが、
SELECT * と全てを抽出している点、
フォームでDisplayMember、ValueMember、コードでその他の部分と処理が分かれてしまっている点
が気になります。
コードのみに全ての処理をかければ、SELECT *で全てを抽出せず、必要な部分のみ抽出出来ればと思うのですが、
たくさん引数を持たせる方法しか考え付きません。
何かいい方法はありませんでしょうか。
■No28588に返信(むちかさんの記事)

> たくさん引数を持たせる方法しか考え付きません。
たくさんというのがどの程度のことを言っているのかによりますが、
DisplayMember用フィールドの名前とValueMember用フィールドの名前の2つを
追加すれば出来ますが、それでは多すぎますか?

ComboBoxの派生クラスを作れば、プロパティだけで処理出来るようにはなりますが
結局DisplayMember,ValueMemberを渡すのがプロパティになるだけです。

どういった点に満足がいかないのでしょうか?
■No28588に返信(むちかさんの記事)
> お世話になります。
>
> SQLserverからテーブルを読み込んで、複数あるコンボボックスにそれぞれデータをセットしようとしています。
> 現在は、フォームからコンボボックスのプロパティでDisplayMember、ValueMemberを書いて、
> コードで
> Public Sub SetComboItem(ByVal Combo_Name As ComboBox, ByVal Table_Name As String)
> Dim table As DataTable
>
> table = ReturnTable("SELECT * FROM " & Table_Name & " ORDER BY " & Me.DisplayMember)
> Me.DataSource = table
> Me.SelectedIndex = -1
> End Sub
> としています。(ReturnTableはsql文を読み込み、データテーブルにデータをセットして返す関数です)
>
> この方法でも動くのですが、
> SELECT * と全てを抽出している点、
> フォームでDisplayMember、ValueMember、コードでその他の部分と処理が分かれてしまっている点
> が気になります。
> コードのみに全ての処理をかければ、SELECT *で全てを抽出せず、必要な部分のみ抽出出来ればと思うのですが、
> たくさん引数を持たせる方法しか考え付きません。
> 何かいい方法はありませんでしょうか。

主旨が良く理解出来ていない上での回答ですが
こういうことですか?

''' <summary>
''' 指定したComboBoxに任意のDataTableをセットする(表示と値の設定も同時に行う)
''' </summary>
''' <param name="tbl">渡すDataTable</param>
''' <param name="cmb">受け取るComboBox</param>
''' <param name="dispcolName">表示列名</param>
''' <param name="valuecolName">値列名</param>
''' <remarks></remarks>
Private Sub DataTable_Set_ComboBox(ByVal tbl As DataTable, ByVal cmb As ComboBox, ByVal dispcolName As String, ByVal valuecolName As String)
cmb.DataSource = tbl
cmb.DisplayMember = dispcolName
cmb.ValueMember = valuecolName
End Sub
2011/05/24(Tue) 16:25:39 編集(投稿者)

■No28588に返信(むちかさんの記事)
> Public Sub SetComboItem(ByVal Combo_Name As ComboBox, ByVal Table_Name As String)
Combo_Name って使ってない上に、Name なんてつけると文字列かと思いきやコンボボックス
自体だったりするのでイラっとするコードだなぁ。。。

結局、Me.DataSource に設定してるんだから、このコード自体がコンボボックスの継承クラス
に書いてあるんじゃないの?
適当に
Public Sub SetComboItem(ByVal Display_Member As String, ByVal Table_Name As String)
    Dim table As DataTable
    
    Me.DisplayMember = Display_Member
    table = ReturnTable("SELECT * FROM " & Table_Name & " ORDER BY " & Me.DisplayMember)
    Me.DataSource = table
    Me.SelectedIndex = -1
End Sub
でいいんじゃない?

> コードのみに全ての処理をかければ、SELECT *で全てを抽出せず、必要な部分のみ抽出出来ればと思うのですが、
提示のコードは、該当テーブルを全て抽出する事が目的のコードです。
全て抽出して設定する仕様なのに、貴方が「必要な部分のみ」に勝手に変更しようと
しているのであれば、今後、設計者との間で問題が起こると思われます。
的外れな事を言っていないか設計者とよくよく相談しておく事をお勧めします。
とりあえず、
TableName,DisplayMember用フィールド(DispColumnとする),ValueMember用フィールド(ValueColumnとする)があってそれらから希望のデータを取得するSQL文作成方法は

String.Format("Selecr {0}, {1} From {2} ORDER BY {1}",ValueColumn, DispColumn, TableName)

です。
皆さんありがとうございます。
少しずれていたみたいですので、もう一度よく考えてみます。
書いてくださったコードは参考にさせていただきます。
本当にすみません。

>Combo_Name って使ってない上に、Name なんてつけると文字列かと思いきやコンボボックス
>自体だったりするのでイラっとするコードだなぁ。。。
失礼しました。色々と変更していたので消し忘れていました・・・
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板