【问题标题】:How can I sort a Table into ascending or descending? VB.NET如何将表格排序为升序或降序? VB.NET
【发布时间】:2011-03-03 06:28:31
【问题描述】:

我目前正在通过从 XML 文档中检索数字和名称并动态构建表格来构建表格。目前,表格已构建,您可以选中一个框来选择是否要随机化与名称对应的数字。我需要能够检查另一个框以确定您是否希望它升序或降序。我不知道如何对表对象进行排序。我必须先将其读入一个数组,然后再将它们重新读入表中吗?

XML 文档示例:

- <roster>
- <student>
  <order>01</order> 
  <name>Sabrina Spark</name> 
  </student>
- <student>
  <order>02</order> 
  <name>Ryan Weble</name> 
  </student>
- <student>
  <order>03</order> 
  <name>Fredric Scott</name> 
  </student>
- <student>
  <order>04</order> 
  <name>Cory Snyder</name> 
  </student>

代码:
标记:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="StyleSheet1.css" rel="Stylesheet" type = "text/css" media = "screen" />
</head>
<body>
    <form id="form1" runat="server">
    <div>

        <asp:CheckBox ID="Descending" runat="server" Text="Descending" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
        <asp:CheckBox ID="ExistingOrder" runat="server" Text="Existing Order" />

        <br />
        <asp:Xml ID="Xml1" runat="server"></asp:Xml>
        <br />
        <asp:XmlDataSource ID="XmlDataSource1" runat="server" 
            DataFile="~/App_Data/roster.xml" TransformFile="~/App_Data/roster.xsl">
        </asp:XmlDataSource>
        <br />
        <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
        <br />
        <br />
        <asp:Button ID="cmdRandomize" runat="server" Height="36px" Text="Generate Table" 
            Width="127px" />
        <br />

    </div>
    </form>
</body>
</html>

后面的代码:

Imports System.Xml
Imports System.IO
Partial Public Class _Default
    Inherits System.Web.UI.Page
    Dim rand As New Random()
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then

        End If
    End Sub
    Protected Sub cmdRandomize_Click(ByVal sender As Object, ByVal e As EventArgs) Handles cmdRandomize.Click

        Dim intArl(15) As Integer

        Dim ds As DataSet
        Dim dr As DataRow

        Dim tbl As New Table

        Dim strPath As String

        'Placehold control will hold the dynamically created table
        PlaceHolder1.Controls.Clear()

        'build path to data file
        strPath = Server.MapPath("/App_Data") & "\roster.xml"


        ds = New DataSet()

        'load dataset object with data from xml source
        ds.ReadXml(strPath)

        Dim dtRoster As DataTable = ds.Tables(0)

        'Generate table of random order ints 
        If ExistingOrder.Checked = False Then
            genUnique(intArl, dtRoster.Rows.Count - 1)
        Else
            intArl = ViewState("intArl")
        End If


        Dim intSeq As Integer = 0
        For Each dr In dtRoster.Rows
            Dim tr As New TableRow
            For intColCnt = 0 To 1
                Dim tc As New TableCell()
                Dim txtBox As New TextBox()
                If intColCnt = 0 Then
                    txtBox.Text = intSeq
                Else
                    txtBox.Text = dr(intColCnt)
                End If
                'Add the control to the TableCell
                tc.Controls.Add(txtBox)
                'Add the TableCell to the TableRow
                tr.Cells.Add(tc)
            Next
            If intSeq Mod 2 Then
                tr.CssClass = "odd"
            Else
                tr.CssClass = "even"
            End If



            tbl.Rows.Add(tr)
            intSeq += 1

        Next
        PlaceHolder1.Controls.Add(tbl)


        ViewState("intArl") = intArl
    End Sub
    Private Sub genUnique(ByRef intArl() As Integer, ByVal intCnt As Integer)
        Dim intGen As Integer
        Dim intClassCnt As Integer
        For intClassCnt = 0 To intCnt
regen:
            'intGen = Int(Rnd() * 20) + 1
            intGen = rand.Next(1, intCnt + 2)
            If Not alreadyExists(intArl, intGen, intClassCnt) Then
                intArl(intClassCnt) = intGen
                Else : GoTo regen
                End If
        Next
    End Sub
    Private Function alreadyExists(ByRef intArl() As Integer, ByVal num As Integer, ByVal curr As Integer) As Boolean
        Dim intCnt As Integer

        'Scan the entries in the array for the existance of the newly
        'generated number.  Return True if found to already exist in the array

        For intCnt = 0 To curr - 1
            If num = intArl(intCnt) Then
                Return True
            End If
        Next
        Return False
    End Function

End Class

【问题讨论】:

    标签: vb.net sorting datatable


    【解决方案1】:
    【解决方案2】:

    由于您是以编程方式生成表格,因此无法对其进行排序。您可以轻松地sort your data table 然后重新生成您的表。另一种选择是使用一个可用的数据控件 DataGridview 例如,它为您处理生成工作,并且在某些情况下允许您在设计器中添加排序。

    【讨论】:

    • 如果我像在链接中那样实现它,我究竟会传递给函数什么?我不知道如何将其更改为升序/降序而不是字母顺序。
    • htmllinkbutton 有一个可以在服务器端处理的 onlick。如果你有两个按钮,你可以有两个处理程序,除非我不明白,否则你不需要传递任何东西。
    • Private Function AlphabeticSort(ByVal dtTable As DataTable, ByVal sortOrder As Integer) As DataTable 是函数头,但这不适用于我的代码。我无法适应我需要做的事情。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多