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 String, ByVal nLen As Integer) As 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 Integer, ByVal nByt As Integer) As 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 を使って同様の表示をする事もできます。こちらも掲示板に「魔界の仮面弁士」さんの投稿のサンプルがありますので参考にして下さい。 |