プロが教える店舗&オフィスのセキュリティ対策術

VBでListBoxを使ってテーブルのようにして以下のことをしたいのですがうまくいきません
1:列1の幅と列2の幅を個々で固定させ、文字数が列幅を超える場合、文字を折り返して表示
2:を追加していった時ListBoxの表示領域数を超えたら垂直スクロールバーを上下させ全表示


 列1           列2
------------------------
aaaaaa          123
------------------------
bbbbbbbbbbbbbb
bbbbbb          222
bbbbb
------------------------
cccccc          454
------------------------
1はイメージ的にはこんな感じです

ListBoxをテーブルのようにするにはURLを参考にしました。
http://msdn.microsoft.com/query/dev10.query?appI …

説明が分かりにくくてすいません

A 回答 (1件)

MultiColumnでは無理ですよ


これは縦に並びきらない項目を水平方向に列として表示していくためのものです

ご希望の表示形式にしたいのであれば DrawItemとMeasureItem を記述することになります

MeasureItemで項目の高さを計算して DrawItemで実際の描画を行います
またListBoxのDrawModeを『OwnerDrawVariable』に変更します
表示を見ながら ListBoxのItemHeightを調整したほうがいい場合あるでしょう

MeasureItemイベントで
  dim tx() as String = listBox1.Items( e.Index ).Split(",")
  dim ss() as String = tx(0).Split(vbcrlf)
  ' 改行があるならその回数で高さを調整
  if ss.Length > 1 then
    e.ItemHeight *= ss.Length
  end if
  '文字の長さによる調整
  for each s as string in ss
    ' > 25の数値は適宜修正してください
    if s.Length > 25 then
      e.ItemHeight += listBox1.ItemHeight
    end if
  next

DrawItemイベントで
  if e.Index > -1 then
    dim tx() as string = listbox1.items(e.Index).split(",")
    dim g as Graphics = e.Graphics
    dim rc as Rectangle = e.Bounds
    dim rc1, rc2 as Rectangle
    rc1 = rc : rc2 = rc
    rc1.width = 217
    rc2.X = 218
    rc2.width = rc.width - rc2.X
    ' 選択されている場合の背景の描画
    if ( e.state and DrawItemState.Selected) = DrawItemState.Selected then
      g.FillRectangle( Brushes.Blue, rc )
    else
      g.FillRectangle(New SolidBrush(ListBox1.BackColor), rc )
    end if
    g.DrawString(tx(0), ListBox1.Font, Brushes.Black, rc1 )
    g.DrawString(tx(1), ListBox1.Font, Brushes.Black, rc2 )
    e.DrawFocusRectangle()
  end if
といった具合です
    • good
    • 0

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