Question

Je crois que tout le code est correct, mais je ne peux pas le faire fonctionner. Le GridView a permis à Ortting = true. Donc, en théorie, lorsque je clique sur l'en-tête de la colonne, le XML dans le GridView devrait trier par cette colonne. Le XML se manifeste dans le GridView, mais ne trie pas du tout. Je suis perplexe.

Dst_test.xml

<?xml version="1.0" encoding="utf-8" ?>
<root>
    <data name="Test1.Text" xml:space="preserve">
        <value>Please Pick Bare Pump</value>
        <comment>Tab - Pump Configuration</comment>
    </data>
    <data name="Test2.Text" xml:space="preserve">
        <value>Complete</value>
        <comment>A07</comment>
    </data>
    <data name="Test3.Text" xml:space="preserve">
        <value>Confirmed</value>
        <comment>A01</comment>
    </data>
</root>

Datasrctransform.xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

    <xsl:param name="sortby"></xsl:param>

    <xsl:output method="xml" indent="yes"/>

    <!--<xsl:template match="@* | node()">
        <xsl:copy>
            <xsl:apply-templates select="@* | node()"/>
        </xsl:copy>
    </xsl:template>-->
    <xsl:template match="root">
        <root>
            <xsl:apply-templates select="data">
                <xsl:sort select="$sortby"/>
            </xsl:apply-templates>
        </root>
    </xsl:template>
    <xsl:template match="data">
        <data>
            <xsl:attribute name="ctrlname">
                <xsl:value-of select="@name"/>
            </xsl:attribute>
            <xsl:attribute name="value">
                <xsl:value-of select="value" />
            </xsl:attribute>
            <xsl:attribute name="comment">
                <xsl:value-of select="comment" />
            </xsl:attribute>
        </data>
    </xsl:template>
</xsl:stylesheet>

Code de code

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender

        If Not IsPostBack Then
            XmlDataSource1.DataFile = "~/App_LocalResources/DST_Test.xml"
            XmlDataSource1.XPath = "//data"
            XmlDataSource1.TransformFile = xsltFileName
            GridView1.DataSource = XmlDataSource1
            GridView1.DataBind()
        End If
End Sub

Protected Sub GridView1_Sorting(ByVal sender As Object, ByVal e As GridViewSortEventArgs) Handles GridView1.Sorting

        Select Case e.SortExpression

            Case "ctrlname"
                sortAttr = "@name"
            Case "value"
                sortAttr = "value"
            Case "comment"
                sortAttr = "comment"
        End Select

        Dim xslTrnsform As System.Xml.Xsl.XsltArgumentList = New System.Xml.Xsl.XsltArgumentList
        xslTrnsform.AddParam("sortby", "", sortAttr)
        XmlDataSource1.EnableCaching = False
        XmlDataSource1.TransformArgumentList = xslTrnsform
        XmlDataSource1.DataFile = "~/App_LocalResources/DST_Test.xml"
        XmlDataSource1.XPath = "//data"
        XmlDataSource1.TransformFile = xsltFileName
        GridView1.DataSource = XmlDataSource1
        GridView1.DataBind()
End Sub

Html

<div>
            <asp:GridView ID="GridView1" runat="server"  AllowPaging="True" AllowSorting="True" 
                PageSize="25"
                AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="ctrlname" HeaderText="ctrlname" 
                        SortExpression="ctrlname" />
                    <asp:BoundField DataField="value" HeaderText="value" SortExpression="value" />
                    <asp:BoundField DataField="comment" HeaderText="comment" 
                        SortExpression="comment" />
                </Columns>
            </asp:GridView>
</div>
<asp:XmlDataSource ID="XmlDataSource1" runat="server">            
</asp:XmlDataSource>
Était-ce utile?

La solution

Je ne connais pas d'autres parties, mais je suis sûr que vous avez un problème dans votre XSL qui ne trie pas correctement les données. Essayez d'utiliser ce XSL (tri par défaut par commentaire):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

    <xsl:output method="xml" indent="yes"/>

    <xsl:param name="sortby" select="'comment'"/>

    <xsl:template match="root">
        <root>
            <xsl:apply-templates select="data">
                <xsl:sort select="*[name()=$sortby]" order="ascending"/>
            </xsl:apply-templates>
        </root>
    </xsl:template>

    <xsl:template match="data">
        <data>
            <xsl:attribute name="ctrlname">
                <xsl:value-of select="@name"/>
            </xsl:attribute>
            <xsl:attribute name="value">
                <xsl:value-of select="value" />
            </xsl:attribute>
            <xsl:attribute name="comment">
                <xsl:value-of select="comment" />
            </xsl:attribute>
        </data>
    </xsl:template>
</xsl:stylesheet>

Édité maintenant pour inclure l'ordre de tri comme paramètre (par défaut ascendant):

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">

    <xsl:output method="xml" indent="yes"/>

    <xsl:param name="sortby" select="'comment'"/>
  <xsl:param name="order" select="'ascending'"/>

    <xsl:template match="root">
        <root>
            <xsl:apply-templates select="data">
                <xsl:sort select="*[name()=$sortby]" order="{$order}"/>
            </xsl:apply-templates>
        </root>
    </xsl:template>

    <xsl:template match="data">
        <data>
            <xsl:attribute name="ctrlname">
                <xsl:value-of select="@name"/>
            </xsl:attribute>
            <xsl:attribute name="value">
                <xsl:value-of select="value" />
            </xsl:attribute>
            <xsl:attribute name="comment">
                <xsl:value-of select="comment" />
            </xsl:attribute>
        </data>
    </xsl:template>
</xsl:stylesheet>

Explication:

  • *[name()=$sortby] Sélectionne tous les nœuds descendants dont le nom est égal à notre paramètre $sortby
  • order="{$order}" est utilisé pour définir la valeur de l'attribut d'ordre à l'aide du paramètre. La valeur peut être ascending ou descending.

Notez que le tri est effectué par défaut en supposant text Type de données.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top