リストボックスで1つの項目に複数のデータを持たせる方法

解決


ほり  2005-08-02 20:06:11  No: 91217

リストボックスで、下のようなデータを、表示するのは最初の項目で、複数のデータを持たせる方法を教えてください。
2つのリストボックス間で移動したり順番を変えるので、別配列に入れておくと処理が複雑になります。
以前はてtextとvalueの2つの値をもてたような気がするんですが・・・
vb.net2003です。 
よろしくお願いします。

aaa,1-1,説明1,・・・,・・・
bbb,1-2,説明2,・・・,・・・
ccc,2-1,説明3,・・・,・・・
ddd,2-2,説明4,・・・,・・・


特攻隊長まるるう  2005-08-02 21:00:37  No: 91218

過去ログはコンボボックスですけど、
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200312/03120132.txt
配列を要素として持つオリジナル Class を作成し、
ToString で配列の要素を並べて返すようにすれば
リストボックスでも同じ様に実現できます。


ほり  2005-08-02 21:35:26  No: 91219

特攻隊長まるるうさん、ありがとうございます。
「リストボックス」「listbox」「複数項目」「複数データ」など、色々なキーワードで検索したつもりだったんですが・・・


特攻隊長まるるう  2005-08-02 22:06:52  No: 91220

>色々なキーワードで検索したつもりだったんですが
いや、過去ログはコンボボックスですし(^^;)
ボクが検索したキーワードは『Overrides Function ToString』
回答を知らないと分からないでしょう?。分かる範囲で検索して
いただければ十分です。


ほり  2005-08-02 22:20:48  No: 91221

検索キーワードって、結構難しいですね。
無事スマートなコードになりました。
さっきまで、項目のデータを
表示する文字+沢山の空白,1-1,説明1,・・・,・・・
として、リストボックスに他の項目が見えないようにして、splitでばらしてというコードを書いてたんです。

で、質問解決したところで書くのも何なんですが、
With DirectCast(Me.ComboBox1.SelectedItem, PersonalInfo)
  MessageBox.Show(String.Format(MsgFmt, .Code, .Name))
End With
の所を、
With Me.ComboBox1.SelectedItem
  MessageBox.Show(String.Format(MsgFmt, .Code, .Name))
End With
としても動くんですが、別にDirectCastって無くてもいいんですよね。


特攻隊長まるるう  2005-08-02 23:11:38  No: 91222

時間があったのでサンプルコード♪
自分で書いたコードと見比べてみて下さい。

>としても動くんですが、別にDirectCastって無くてもいいんですよね。
DirectCast のヘルプは読まれました?型変換をしている
訳ですが、[VB6.0]時代でもバグのない良いプログラムを書く人は、
データ型をはっきり意識していました。[VB.NET]でもよりレベルの
高いプログラムを目指すならデータ型をハッキリさせ、『暗黙の型変換』
や『遅延バインディング』はできるだけ避けましょう。
例えばプログラムの先頭に
  Option Strict On
と記述してみましょう。コンパイルエラーメッセージが表示されます。
[VB.NET]
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim wListItem As MyListItem
        Dim wStr As String = [String].Empty
        Dim i As Integer
        ' 設定
        For i = 0 To 3
            wListItem = New MyListItem(4)
            With wListItem
                .Items(0) = wStr.PadLeft(3, Chr(97 + i))
                .Items(1) = CStr(i \ 2 + 1) & "-" & CStr(i Mod 2 + 1)
                .Items(2) = "説明" & CStr(i + 1)
                .Items(3) = "・・・"
                .Items(4) = "・・・"
            End With
            Me.ListBox1.Items.Add(wListItem)
        Next
        ' 取り出し
        wListItem = DirectCast(Me.ListBox1.Items(1), MyListItem)
        Debug.WriteLine(wListItem.Items(2))
    End Sub

    Public Class MyListItem
        Private mItem() As String
        Public Sub New(ByVal ItemIndex As Integer)
            ReDim Me.mItem(ItemIndex)
        End Sub
        Public Property Items() As String()
            Get
                Return Me.mItem
            End Get
            Set(ByVal Value As String())
                Me.mItem = Value
            End Set
        End Property
        Public Overrides Function ToString() As String
            Dim wStrBuilder As New System.Text.StringBuilder
            Dim i As Integer
            With wStrBuilder
                For i = 0 To Me.mItem.GetLength(0) - 1
                    .Append(Me.mItem(i)).Append(", ")
                Next
                Return .ToString
            End With
        End Function
    End Class


特攻隊長まるるう  2005-08-02 23:22:23  No: 91223

あ、もちろん、質問は最初の項目のみの表示でいいので
        Public Overrides Function ToString() As String
            Return Me.mItem(0)
        End Function
です。汎用性のあるサンプルとして、全ての要素を書き出してます。


ほり  2005-08-03 17:46:35  No: 91224

>[VB6.0]時代でもバグのない良いプログラムを書く人は、
>データ型をはっきり意識していました。[VB.NET]でもよりレベルの
>高いプログラムを目指すならデータ型をハッキリさせ、『暗黙の型変換』
>や『遅延バインディング』はできるだけ避けましょう。
データの型宣言は、.NETになって一番感じることです。
肝に銘じてプログラムします、はい。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加