リストボックスで、下のようなデータを、表示するのは最初の項目で、複数のデータを持たせる方法を教えてください。
2つのリストボックス間で移動したり順番を変えるので、別配列に入れておくと処理が複雑になります。
以前はてtextとvalueの2つの値をもてたような気がするんですが・・・
vb.net2003です。
よろしくお願いします。
aaa,1-1,説明1,・・・,・・・
bbb,1-2,説明2,・・・,・・・
ccc,2-1,説明3,・・・,・・・
ddd,2-2,説明4,・・・,・・・
過去ログはコンボボックスですけど、
http://madia.world.coocan.jp/cgi-bin/VBBBS/wwwlng.cgi?print+200312/03120132.txt
配列を要素として持つオリジナル Class を作成し、
ToString で配列の要素を並べて返すようにすれば
リストボックスでも同じ様に実現できます。
特攻隊長まるるうさん、ありがとうございます。
「リストボックス」「listbox」「複数項目」「複数データ」など、色々なキーワードで検索したつもりだったんですが・・・
>色々なキーワードで検索したつもりだったんですが
いや、過去ログはコンボボックスですし(^^;)
ボクが検索したキーワードは『Overrides Function ToString』
回答を知らないと分からないでしょう?。分かる範囲で検索して
いただければ十分です。
検索キーワードって、結構難しいですね。
無事スマートなコードになりました。
さっきまで、項目のデータを
表示する文字+沢山の空白,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って無くてもいいんですよね。
時間があったのでサンプルコード♪
自分で書いたコードと見比べてみて下さい。
>としても動くんですが、別に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
あ、もちろん、質問は最初の項目のみの表示でいいので
Public Overrides Function ToString() As String
Return Me.mItem(0)
End Function
です。汎用性のあるサンプルとして、全ての要素を書き出してます。
>[VB6.0]時代でもバグのない良いプログラムを書く人は、
>データ型をはっきり意識していました。[VB.NET]でもよりレベルの
>高いプログラムを目指すならデータ型をハッキリさせ、『暗黙の型変換』
>や『遅延バインディング』はできるだけ避けましょう。
データの型宣言は、.NETになって一番感じることです。
肝に銘じてプログラムします、はい。
ツイート | ![]() |