-1

我有这个 XML 文件,我从中获取所有数据:

<?xml version="1.0" encoding="utf-8"?>
<Tabel>
  <Member>
    <Naam>Cruciatum</Naam>
    <Kills>10</Kills>
    <Deaths>2</Deaths>
    <Score>2222</Score>
  </Member>
  <Member>
    <Naam>test</Naam>
    <Kills>123</Kills>
    <Deaths>12</Deaths>
    <Score>12222</Score>
  </Member>
  <Member>
    <Naam>test2</Naam>
    <Kills>159</Kills>
    <Deaths>12</Deaths>
    <Score>2222</Score>
  </Member>
  <Member>
    <Naam>test3</Naam>
    <Kills>159</Kills>
    <Deaths>122</Deaths>
    <Score>222284</Score>
  </Member>
  <Member>
    <Naam>test4</Naam>
    <Kills>15</Kills>
    <Deaths>1229</Deaths>
    <Score>129453</Score>
  </Member>
</Tabel>

我把它全部显示在 5 个不同的列表框中(“成员”下的每个子节点 1 个)。

我有以下代码可以做到这一点。

Public Class Rank
    Dim memberNodes As XmlNodeList
    Dim memberNode As XmlNode
    Dim x As Short
    Dim dataNodes As XmlNodeList
    Dim firstinrow As Boolean
    Dim datalist(5) As String
    Dim y As Short

    Private Sub Rank_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        lstView.Items.Clear()
        x = 0
        Dim doc As New XmlDocument()
        doc.Load("C:\Members.xml")
        memberNodes = doc.GetElementsByTagName("Member")
        For Each memberNode In memberNodes
            dataNodes = memberNode.ChildNodes
            y = 1
            For Each dataNode As XmlNode In dataNodes
                datalist(y) = dataNode.InnerText
                datalist(0) = (x + 1).ToString
                y += 1
            Next
            datalist(5) = datalist(4)
            datalist(4) = FormatNumber((datalist(2) / datalist(3)), 3)
            Dim lvi As New ListViewItem(datalist)
            lstView.Items.Add(lvi)
            x += 1
        Next

    End Sub
End Class

该代码目前运行良好,显示完整列表。但是现在我需要按列表视图的 Score 列中的值排序的所有数据,因此在以下示例中: 到目前为止的结果

我需要第一行说:“1 test3 159 122 1.303 222284”

第二行得分第二名等。

更新: 按照@SteveDog 的建议,我现在使用 1 个列表视图,而不是单独的列表框

4

2 回答 2

1

使用 View 属性设置为 Details 的 ListView 控件或使用 DataGridView 控件,而不是单独的列表框。如果您必须使用类似的单独列表框,则需要在每个类上实现 IComparable 接口以覆盖排序。

诚然,在 ListView 控件中排序有点痛苦。让它如此灵活很好,但是当你想做的只是一个简单的排序时,它会很痛苦。首先,您需要创建一个实现 IComparer 接口的排序器对象。例如:

Public Class ScoreSorter
    Implements IComparer

    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
        Try
            Dim xItem As ListViewItem = CType(x, ListViewItem)
            Dim yItem As ListViewItem = CType(y, ListViewItem)
            Dim xInt As Integer = Integer.Parse(xItem.SubItems(5).Text)
            Dim yInt As Integer = Integer.Parse(yItem.SubItems(5).Text)
            Return yInt - xInt
        Catch
            Return 0
        End Try
    End Function
End Class

然后需要将ListView控件的ListViewItemSorter属性设置为一个新的sorter对象实例,然后告诉它进行排序,如:

ListView1.ListViewItemSorter = New ScoreSorter()
ListView1.Sort()
于 2012-05-24T13:11:35.200 回答
0

试试这个(未测试):

Dim sortedNodes = memberNodes.OrderBy(Function(n) n.ChildNodes(3))
For Each memberNode In sortedNodes
   ...
Next

您将需要一个Imports System.Linq.

于 2012-05-24T13:14:58.543 回答