アプリ版:「スタンプのみでお礼する」機能のリリースについて

vb .net Winアプリでコンボボックスに値をセットする方法を教えて下さい。


table1
都道府県コード,都道府県名(カナ),都道府県名
01,ホッカイドウ,北海道
02,アオモリケン,青森県
03,イワテケン,岩手県

のテーブルがあり、既に読み込んでいます。
このデータをコンボボックスにセットしたいです。


Dim NpgsqlConnection1 As NpgsqlConnection
Dim NpgsqlCommand1 As NpgsqlCommand
Dim NpgsqlDataAdapter1 As NpgsqlDataAdapter
Dim String1 As String
Dim DataTable1 As DataTable

NpgsqlConnection1 = New Npgsql.NpgsqlConnection
NpgsqlConnection1.ConnectionString = gstrCnct
NpgsqlConnection1.Open()

String1 = "select * from table1;"

NpgsqlCommand1 = New NpgsqlCommand
NpgsqlCommand1.Connection = NpgsqlConnection1
NpgsqlCommand1.CommandText = String1
NpgsqlDataAdapter1 = New NpgsqlDataAdapter(String1, NpgsqlConnection1)
DataTable1 = New System.Data.DataTable

NpgsqlDataAdapter1.Fill(DataTable1)

' 一括の方法でもOK
' Me.ComboBox1.??? = ????

' ぐるぐるしながらセットでもOK
' Me.ComboBox1.??? = Space(0)
' Me.ComboBox1.??? = "ミセンタク"
' Me.ComboBox1.??? = "未選択"
For Each DataRow1 As DataRow In DataTable1.Rows
' Me.ComboBox1.??? = DataRow1("都道府県コード")
' Me.ComboBox1.??? = DataRow1("都道府県名(カナ)")
' Me.ComboBox1.??? = DataRow1("都道府県名")
Next DataRow1



■要件
メインの情報は都道府県名ですが、
めくった時に
都道府県コード,都道府県名(カナ),都道府県名
を見せる形で作りたいです。


都道府県コードは取り出す必要があります。


データ
1行目は空白,ミセンタク,未選択
2行目以降はtable1から取り出した値。



以上、よろしくお願いします。

A 回答 (3件)

DataSourceプロパティに対象のDataTableを突っ込んで,


ref) http://msdn.microsoft.com/ja-jp/library/vstudio/ …
DisplayMemberプロパティに表示したいDataColumnのColumnNameを設定すればよいかと。
ref) http://msdn.microsoft.com/ja-jp/library/vstudio/ …

追加資料:Visual Studio でのデータへの Windows フォーム コントロールのバインド
http://msdn.microsoft.com/ja-jp/library/vstudio/ …
    • good
    • 0
この回答へのお礼

有難う御座います。

単純なケースでは成功しているのですが、

・DataTableの情報以外に1レコードだけコンスタント値でつっこむ

・複数の項目をプルダウンで見せる

この2点が分かりません。

お礼日時:2013/11/05 09:31

一時的なDataTableを構築して これをDataSouseやDisplayMember,ValueMemberに設定してみてはいかがでしょう



' 列情報などを複製する
dim dt as DataTable = DataTable1.Clone
' 表示列以外のデータの取得用
dt.Columns.add("ValueMember")

' 未選択の行を追加
dim row as DataRow = dt.NewRow
row("都道府県コード") = space(0)
row("都道府県名(カナ)") = "ミセンタク"
row("都道府県名") = "未選択"
dt.rows.add(row)

' 都道府県のデータを追加
dim rd as DataTableReader = DataTable1.CreateDataReader
dt.Load(rd)

' ValueMember列の生成
for each row in dt.rows
  row("valueMember") = row(0) & "," & row(1)
next

' ComboBoxへのヒモ付け
ComboBOx1.DataSource = dt
ComboBox1.DisplayMember = dt.Ccolumns(2).ColumnName ' 都道府県名
ComboBox1.ValueMember = dt.Columns(3).ColumnName ' 都道府県コード,都道府県名(カナ)

といった具合で …

取り出しの際は
ComboBox1.Textで 都道府県名
ComboBox1.SelectedValue で 都道府県コード,都道府県名(カナ)
を取得できますよ
    • good
    • 0
この回答へのお礼

有難う御座います。

半分ぐらいやりたい事は出来ました。

後は、「複数項目を見せる」だけなのですが、
DisplayMember には1つしかセットできないし、
ValueMember は内部の値で表に出せないですよね。

ComboBoxでは無理なのでしょうか?
無理だとしたら、何のコントロールならできるのでしょうか?

コードと名称を同時に見せて、コンボボックス状に表現しているアプリを見かける事がありますが、VBでは無理なのでしょうか?

お礼日時:2013/11/05 11:59

表示項目(Text)とリスト項目(DisplayMember)を異なる設定には出来ないみたいです



そこで解決案として ComboBoxを継承したクラスを生成して
この中に 選択用と表示用の2つのConnboBoxを作って制御するといった具合になろうかと思います

' 選択用に cbSelectなどを Private WithEvents で宣言
private withEvents cbSelect as ComboBox

Sub Newを追加して
cbSelect = new ComboBox
' 表示用のドロップダウンの高さを1に設定して 見かけ上非表示にする
Me.DropDownHeight = 1
' 選択用を非表示にする
cbSelect.Visible =False

' 継承クラスのKeyDownイベントにて
if e.Alt AndAlso e.KeyCode = keys.Down then
  ' 処理済にするため
  e.Handled = true
  ' 選択用を表示して ドロップダウンリストを表示する
  cbSelect.Show
  cbSelect.DropDown = true
  ' 自分を非表示に
  me.hide
end if

cbSelectのDropDownClosedイベントにて
cbSelect.Hide
me.Show
me.Focus

' WINAPIの宣言を追加
  <StructLayout(LayoutKind.Sequential)> _
  Structure tCOMBOBOXINFO
    Dim cbSize As Integer
    Dim rcItem As Rectangle
    Dim rcButton As Rectangle
    Dim stateButton As Integer
    Dim hwndCombo, hwndItem, hwndList As IntPtr
  End Structure

  Declare Ansi Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hWnd As IntPtr, ByVal umsg As UInt32, ByVal wParam As Integer, ByRef lParam As tCOMBOBOXINFO) As Integer

  Const COMBOBOXINFO As UInt32 = &H164
  Const STATE_SYSTEM_PRESSED As UInt32 = 8
  Const STATE_SYSTEM_INVISIBLE As UInt32 = &H8000

  Dim cbInfo As tCOMBOBOXINFO

' 継承コントロールのMouseDownイベントで
if e.Button = e.Button = Windows.Forms.MouseButtons.Left Then
  Dim cb As tCOMBOBOXINFO
  cb.cbSize = 52
  If SendMessage(Me.Handle, COMBOBOXINFO, 0, cb) > 0 Then
    If cb.stateButton = STATE_SYSTEM_PRESSED Then
      cbSelect.Show()
      cbSelect.DroppedDown = True
      Me.Hide()
    End If
  End If
end if

' 継承コントロールのParentChangedイベントで
cbSelect.Parent = me.Parent

' 選択用のDisplayMemberプロパティの公開
public Property DisplayMember2 as String
  get
    return cbSelect.DisplayMember
  End get
  set(value as string)
    cbSelect.DisplayMember = value
  End Set
End Property

' 選択用のDorpDownHeightプロパティの公開
  Public Property DropDownHeight2() As Integer
    Get
      Return cbSelect.DropDownHeight
    End Get
    Set(ByVal value As Integer)
      cbSelect.DropDownHeight = value
    End Set
  End Property

' Size Width Location DataSourceのShadow化
Public shadows Property Size as Size
  get
    retur myBase.Size
  End Get
  Set(value as Size)
    cbSelect.size = value
    myBase.size = value
  End Set
End Property
' 同様に Width Location DataSource を作成

といった具合で 出来るかと …
選択しているときの コンボボックスの表示が コード、読み、都道府県名 になってしまう点が ご希望に添えてないと思います
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!