是否已经厌倦了ListBox一成不变的风格,可能你的程序要一个外观更加丰富的ListBox,当然我们可以通过重写ListtBox控件或做一个全新的用户制定义控件来实现这些需求。这样做无疑会添加很多劳动量,以及作业强度。有没有更好的方法呢,看看下面的办法能不能达到你的要求。
在ListBox的DrawItem事件里添加代码。
首先,将ListBox的控件列表框的绘制方式改成用户绘制
ListBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed
注:一下所有关于代码的讨论都是在 .Net Framework 2.0 下进行
是否已经厌倦了ListBox一成不变的风格,可能你的程序要一个外观更加丰富的ListBox,当然我们可以通过重写ListtBox控件或做一个全新的用户制定义控件来实现这些需求。这样做无疑会添加很多劳动量,以及作业强度。有没有更好的方法呢,看看下面的办法能不能达到你的要求。
在ListBox的DrawItem事件里添加代码。
首先,将ListBox的控件列表框的绘制方式改成用户绘制
ListBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed
然后添加 ListBox1.DrawItem事件。
代码如下
ListBox1.DrawItem事件
Private Sub ListBox1_DrawItem(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DrawItemEventArgs) Handles ListBox1.DrawItem
Dim g As Graphics = e.Graphics
' 获得要显示的文字 ( 也可以根据 e.Index 直接从DataTable中取数据)
Dim strValue As String = System.Convert.ToString(ListBox1.Items.Item(e.Index))
If Not String.IsNullOrEmpty(strValue) Then
Dim strValues() As String = strValue.Split("|")
If strValues.Length = 6 Then
' 往listbox中添加数据的时候每一项就用“|”隔开
' 品目code:strValues(0)
' No :strValues(1)
' ..
' Message : strValues(5)
' 品目code (第一行第一列)
g.DrawString(strValues(0), Font, Brushes.Black, e.Bounds.Left + col1Pos, e.Bounds.Top + row1Pos)
' No (第一行第二列)
g.DrawString(strValues(1), Font, Brushes.Black, e.Bounds.Left + col2Pos, e.Bounds.Top + row1Pos)
' 品名 (第一行第三列)
g.DrawString(strValues(2), Font, Brushes.Black, e.Bounds.Left + col3Pos, e.Bounds.Top + row1Pos)
' 消费/生产 (第二行第一列)
g.DrawString(strValues(3), Font, Brushes.Black, e.Bounds.Left + col1Pos, e.Bounds.Top + row2Pos)
' LinkNo (第二行第二列)
g.DrawString(strValues(4), Font, Brushes.Black, e.Bounds.Left + col2Pos, e.Bounds.Top + row2Pos)
' Message (第三行第一列)
g.DrawString(strValues(5), Font, Brushes.Black, e.Bounds.Left + col1Pos, e.Bounds.Top + row3Pos)
End If
End If
' 最底下的线
g.DrawLine(Pens.Black, e.Bounds.Left, e.Bounds.Bottom - 1, e.Bounds.Right, e.Bounds.Bottom - 1)
End Sub
运行效果如下图
示例代码