|
Das ListView Steuerelement, wunderbar geeignet um tabellarische Daten anzuzeigen, fehlt leider die Möglichkeit die Daten zu speichern und zu wieder zu laden. Mit der nachfolgenden VB2008 Klasse ist das kein Problem mehr. Die Klasse erbt von ListView und wird dabei um die Load und Save Methode erweitert. Die neuen Methoden nutzen dabei die LINQ to XML Technik. Doch nicht nur die Daten werden als XML gespeichert, sondern zusätzlich noch die ColumnHeader Informationen, so dass ein ListView komplett wiederhergestellt werden kann.
Nachfolgend die Klasse ListViewEx
Imports System.Windows.Forms.ListViewItem
Public Class ListViewEx
Inherits Windows.Forms.ListView
Private Structure ItemElement
Dim ItemText As String
Dim ItemBackColor As Integer
Dim ItemForeColor As Integer
Dim ItemFont As String
Dim ItemFontSize As Integer
End Structure
Public Sub Save(ByVal FileName As String)
Try
Dim xDoc As New XDocument()
With xDoc
.Declaration = New XDeclaration("1.0", "", "")
.Add(New XElement("ListView"))
' ColumnHeader in das XML-Dokument einfügen
.Root.Add(From col As ColumnHeader In Me.Columns _
Select <ColumnHeader>
<Text><%= col.Text %></Text>
<Name><%= col.Name %></Name>
<DisplayIndex><%= col.DisplayIndex %></DisplayIndex>
<Width><%= col.Width %></Width>
</ColumnHeader>)
' Items in das XML-Dokument einfügen
.Root.Add(From Item As ListViewItem In Me.Items _
Select <Item>
<%= From SubItem As ListViewSubItem In Item.SubItems _
Select <Text BackColor=<%= SubItem.BackColor.ToArgb %>
ForeColor=<%= SubItem.ForeColor.ToArgb %>
Font=<%= SubItem.Font.Name %>
FontSize=<%= CInt(SubItem.Font.Size) %>>
<%= SubItem.Text %></Text> %>
</Item>)
' XML-Datei speichern
.Save(FileName)
End With
Catch ex As Exception
Throw ex
End Try
End Sub
Public Sub Load(ByVal FileName As String)
Try
Me.Items.Clear()
Me.Columns.Clear()
Me.BeginUpdate()
' XML-Datei einlesen
Dim xListView = XElement.Load(FileName)
' ColumnHeader aus XML erstellen
Me.Columns.AddRange((From col In xListView.Descendants("ColumnHeader") _
Select New ColumnHeader With { _
.Text = col.Element("Text"), _
.Name = col.Element("Name"), _
.DisplayIndex = CInt(col.Element("DisplayIndex")), _
.Width = CInt(col.Element("Width"))}).ToArray)
' Items aus XML einlesen und dem ListView hinzufügen
For Each Item In xListView.Descendants("Item")
' Item Struktur erstellen
Dim Items As IEnumerable(Of ItemElement) = _
From SubItem In Item.Descendants("Text") _
Select New ItemElement _
With {.ItemText = SubItem.Value, _
.ItemBackColor = SubItem.Attribute("BackColor").Value, _
.ItemForeColor = SubItem.Attribute("ForeColor").Value, _
.ItemFont = SubItem.Attribute("Font").Value, _
.ItemFontSize = SubItem.Attribute("FontSize").Value}
' ListView-Item erzeugen
Dim lItem As New ListViewItem()
Dim isRootItem As Boolean = True
' ListView-Item und SubItems füllen
For Each SItem As ItemElement In Items
If isRootItem Then
lItem.UseItemStyleForSubItems = False
lItem.Text = SItem.ItemText
lItem.BackColor = Color.FromArgb(SItem.ItemBackColor)
lItem.ForeColor = Color.FromArgb(SItem.ItemForeColor)
lItem.Font = New Font(SItem.ItemFont, SItem.ItemFontSize, FontStyle.Regular)
isRootItem = False
Else
lItem.SubItems.Add(New ListViewSubItem(lItem, SItem.ItemText, _
Color.FromArgb(SItem.ItemForeColor), _
Color.FromArgb(SItem.ItemBackColor), _
New Font(SItem.ItemFont, SItem.ItemFontSize, FontStyle.Regular)))
End If
Next
' ListView-Item dem ListView hinzufügen
Me.Items.Add(lItem)
Next
Beep()
Catch ex As Exception
Throw ex
Finally
Me.EndUpdate()
End Try
End Sub
End Class
Letzte Änderung: 22 Oct 2009 at 16:13
Zurück |