-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

そのコードは今のところ正常に機能しており、完全なリストが表示されています。ただし、リストビューの[スコア]列の値で並べ替えられたすべてのデータが必要になるため、次の例では次のようになります。 これまでの結果

最初の行に「1test31591221.303222284」と言う必要があります

2行目はスコアなどで2位。

更新: @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 プロパティをソーター オブジェクトの新しいインスタンスに設定し、次のように並べ替えるように指示する必要があります。

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 に答える