玄関へお回り下さい。
ListBoxに複数の項目を指定位置に揃えて表示・取得 (2個)          (SNo.104)
使用コントロール Button1  Button2  ListBox1
その他条件 WindowsXP(Vista) Visual Basic 2005(VB2008)
 
★ ListBoxに複数の項目を指定位置に揃えて表示

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
'自作関数を使ってListBoxに複数列の項目を指定位置に揃えて表示
    With ListBox1
        .Visible = False
        .Font = New Font("MS ゴシック", 12.0)
        .Items.Add(fStrCut("〒527-0011", 12) & _
                   fStrCut("八日市市 12-12", 18) & fStrCut("蚊取 新語", 14))
        .Items.Add(fStrCut("〒547-0011", 12) & _
                   fStrCut("大津市 12-1", 18) & fStrCut("木邑 多来也", 14))
        .Items.Add(fStrCut("〒555-0011", 12) & _
                   fStrCut("彦根市 城町 1-15", 18) & fStrCut("草柳  強", 14))
        .Visible = True
    End With
End Sub
         
上記実行結果  
        

上記で表示したデータを個別に取り出す 
Private
 Sub Button2_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button2.Click
'ListBoxに複数列の項目を表示したデータを個別に取り出し
    Dim cd As String = ListBox1.Items(1)
    Debug.WriteLine(fMidB(cd, 0, 12))   '結果  〒547-0011
    Debug.WriteLine(fMidB(cd, 12, 18))  '結果  大津市 12-1
    Debug.WriteLine(fMidB(cd, 30, 14))  '結果  木邑 多来也
End Sub

文字列を指定のバイト数にカットする関数
Private Function fStrCut(ByVal Mystring As StringByVal nLen As IntegerAs String
'文字列を指定のバイト数にカットする関数(漢字分断回避)
    Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
    Dim TempLen As Integer = sjis.GetByteCount(Mystring)
    If nLen < 1 Or Mystring.Length < 1 Then Return fStrCut
    If TempLen <= nLen Then   '文字列が指定のバイト数未満の場合スペースを付加する
        Return Mystring.PadRight(nLen - (TempLen - Mystring.Length), " ")
    End If
    Dim tempByt() As Byte = sjis.GetBytes(Mystring)
    Dim strTemp As String = sjis.GetString(tempByt, 0, nLen)
    '末尾が漢字分断されたら半角スペースと置き換え
    If strTemp.EndsWith(ControlChars.NullChar) Then
        strTemp = sjis.GetString(tempByt, 0, nLen - 1) & " "
    End If
    Return strTemp
End Function

指定バイト位置から指定バイト数分の文字列を取り出す関数
Private Function fMidB(ByVal myString As String, _
                       ByVal sByt As IntegerByVal nByt As IntegerAs String
'指定バイト位置から指定バイト数分の文字列を取り出す関数
    Dim sjis As System.Text.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
    Dim tempByt() As Byte = sjis.GetBytes(myString)
    Dim sumByt As Integer = sjis.GetByteCount(myString)
    If sByt < 0 Or nByt <= 0 Or sByt > sumByt Then Return ""
    Dim strTemp As String = sjis.GetString(tempByt, 0, sByt)
    If sByt > 0 And strTemp.EndsWith(ControlChars.NullChar) Then
        sByt += 1   '開始位置が漢字の中なら次(前)の文字から開始
    End If
    If sByt + nByt > sumByt Then    '文字長より多く取得しようとした場合
        nByt = sumByt - sByt        '文字列の最後までの分とする
    End If
    Return sjis.GetString(tempByt, sByt, nByt).TrimEnd(vbNullChar)
End Function

VB6.0での方法を.NET用に移植・改良したものです。
.NETでは、オーナードローが簡単にできるので、そちらを勉強された方が後々何かと便利かと思います。
ListBoxのオーナードローについては、掲示板に「魔界の仮面弁士」さんの投稿のサンプルがありますので、それを参考にして下さい。
又、ListBox を使わず、ListView を使って同様の表示をする事もできます。こちらも掲示板に「魔界の仮面弁士」さんの投稿のサンプルがありますので参考にして下さい。





2004/06/12
2005/10/18


VBレスキュー(花ちゃん)
VB.NET2003  VB2005