2016-07-29 26 views
0

Letztendlich versuche ich einen Weg zu finden, meine XML-Daten in einer Gridview-Anzeige erfolgreich zu sortieren und zu filtern.Filtern und Sortieren von XML-Daten nach Datum in vb.net

Ich habe eine XML-Blatt wie folgt aus:

<?xml version="1.0" standalone="yes"?> 
<Notification> 
    <Info> 
    <Event>Template</Event> 
    <Date>1899/01/01</Date> 
    </Info> 
    <Info> 
    <Event>picnic</Event> 
    <Date>2016/07/15</Date> 
    </Info> 
    <Info> 
    <Event>party</Event> 
    <Date>2015/10/29</Date> 
    </Info> 
</Notification> 

Dass ich filtern müssen und Art in eine asp.net gridview auf zwei verschiedenen Seiten. Auf einer Seite halte ich eine große Aufzeichnung aller Ereignisse und erlaube das Hinzufügen, Aktualisieren und Löschen von Aufzeichnungen. Die zweite Gridview befindet sich in der Ecke meiner Hauptseite, die aktuelle/kommende Events anzeigen soll. Ich sehe sie wie so (die zweite eine kleinere Größe Dimensionen hat, aber das ist der einzige Unterschied):

<asp:GridView ID="GridView1" runat="server" HeaderStyle-ForeColor="#FF5A09" RowStyle-ForeColor="#FF9900" 
     AutoGenerateColumns="false" BorderWidth="2px" 
     Width="1294px" Height="350px" AllowPaging="true" 
     OnPageIndexChanging="OnPageIndexChanging" AllowSorting="true" > 

<Columns > 
     <asp:BoundField DataField="Event" HeaderText="Event" ItemStyle-Width="150" /> 
     <asp:BoundField DataField="Date" HeaderText="Date" ItemStyle-Width="150" /> 
      <asp:CommandField ShowEditButton="True" ItemStyle-Width="30"/> 
      <asp:CommandField ShowDeleteButton="True" ItemStyle-Width="30"/> 

</Columns> 

Ich verwende diese vb.net Funktion meiner XML-Daten zu meinem Gridview zu binden

Private Sub BindGrid() 

     Dim ds As New DataSet 
     ds.ReadXml(Server.MapPath("~/Event_Info.xml")) 
     GridView1.DataSource = ds 
     GridView1.DataBind() 
     GridView1.HeaderRow.TableSection = TableRowSection.TableHeader 

    End Sub 

Mein Problem ist, dass, wann immer ich die XML-Daten lese oder versuche es mit Dim doc as XDocument=XDocument.Load("Path to my xml") zu laden, die eingelesenen Daten sind eine Zeichenfolge in der Datumsspalte, so dass ich sie nur sortieren kann, indem ich mein BindGrid() ändert funktionieren wie folgt:

Dadurch konnte ich sortieren, wenn ich nur das Datum JJJJ/MM/TT eingegeben habe, aber meine Funktionen zum Hinzufügen, Löschen und Aktualisieren funktionierten nicht mehr.

, wenn Sie sie sehen wollen, werde ich sie hier posten, aber könnte man wahrscheinlich dieses Bit überspringen: Die Button_Click hier oben ist für das Hinzufügen eines Datensatzes zu der gridview

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    BindGrid() 
    Dim oDs As DataSet = GridView1.DataSource 
    Dim oDr As DataRow = oDs.Tables(0).NewRow 
    oDr("Event") = TextBox1.Text 
    oDr("Date") = TextBox2.Text 

    oDs.Tables(0).Rows.Add(oDr) 
    oDs.WriteXml(Request.PhysicalApplicationPath + "Event_Info.xml") 
    BindGrid() 

    TextBox1.Text = String.Empty 
    TextBox2.Text = String.Empty 

End Sub 

Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting 
    BindGrid() 
    Dim oDs As DataSet = GridView1.DataSource 
    oDs.Tables(0).Rows(GridView1.Rows(e.RowIndex).DataItemIndex).Delete() 
    oDs.WriteXml(Request.PhysicalApplicationPath + "Event_Info.xml") 
    BindGrid() 
End Sub 


Protected Sub GridView1_RowEditing(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewEditEventArgs) Handles GridView1.RowEditing 
    GridView1.EditIndex = e.NewEditIndex 
    BindGrid() 
End Sub 


Protected Sub GridView1_RowCancelingEdit(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCancelEditEventArgs) Handles GridView1.RowCancelingEdit 
    GridView1.EditIndex = -1 
    BindGrid() 
End Sub 


Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating 
    ' Get the new values from the GridView controls 
    Dim i As Integer = GridView1.Rows(e.RowIndex).DataItemIndex 
    Dim n As String = CType(GridView1.Rows(e.RowIndex).Cells(0).Controls(0), TextBox).Text 
    Dim rn As String = CType(GridView1.Rows(e.RowIndex).Cells(1).Controls(0), TextBox).Text 

    GridView1.EditIndex = -1 
    BindGrid() 
    ' Update the XML file using the new values 

    Dim oDs As DataSet = GridView1.DataSource 
    oDs.Tables(0).Rows(i).Item(0) = n 
    oDs.Tables(0).Rows(i).Item(1) = rn 
    oDs.WriteXml(Request.PhysicalApplicationPath + "Event_Info.xml") 
    BindGrid() 
End Sub 

Beenden Sie das Überspringen-Bit

Ich habe auch keine Ahnung, wie Sie die Daten auf der Hauptseite so erfolgreich filtern, dass es nur aktuelle und zukünftige Ereignisse anzeigt. Ich habe versucht, Wege zu finden, eine „where“ -Klausel der Art am Tag anwenden, haben aber

bearbeiten erfolglos gewesen: markiert einen Abschnitt als Code, den ich vergessen haben, als Code

+0

startet durch Schreiben das Schema der xML-Datei, so dass es das Datum als ein tatsächliches Datum enthalten. Dann, wenn Sie die Datei lesen, wird es auch ein Datum sein: oDs.WriteXml (Request.PhysicalApplicationPath + "Event_Info.xml", XmlWriteMode.WriteSchema). Korrigieren Sie auch GridView1_RowUpdating, so dass Sie eine DateTime in die 2. Spalte anstelle einer Zeichenfolge schreiben. Das Textfeld sollte ein String sein, nicht die DataTable oder DGV. – jdweng

+0

@jdweng Danke, das hat mir geholfen, herauszufinden, wie man in ein Schema schreibt, und hat mir einen Schritt bei der Lösung einiger Probleme in diesem Problem erspart. – MacedonZero

Antwort

0

ich die Lösung gefunden zu markieren zu meinem Problem. Ich musste Datenansichten anstelle von Datensätzen verwenden, um meine Daten zu ändern, zu sortieren und zu filtern.

Meine bindgrid Funktion wurde dies:

Private Sub BindGrid() 

     Dim ds As New DataSet 
     ds.ReadXml(Server.MapPath("~/Event_Info.xml")) 
     Dim myView As New DataView 

     myView = ds.Tables(0).DefaultView 

     myView.Sort = "Date desc" 

     GridView1.DataSource = myView 

     GridView1.DataBind() 


    End Sub 

Hinweis diese größere Änderung bedeutete, dass meine hinzufügen/löschen/Update-Funktionen ändern musste. Ich landete sie so zu schreiben, wenn jemand will, um sie sehen:

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     BindGrid() 
     Dim dv As DataView = GridView1.DataSource 
     Dim oDr As DataRowView = dv.AddNew() 
     oDr("Event") = TextBox1.Text 
     oDr("Date") = TextBox2.Text 
     oDr.EndEdit() 

     dv.DataViewManager.DataSet.WriteXml(Request.PhysicalApplicationPath + "Event_Info.xml", XmlWriteMode.WriteSchema) 
     dv.Sort = "Date desc" 
     BindGrid() 

     TextBox1.Text = String.Empty 
     TextBox2.Text = String.Empty 

    End Sub 

    Protected Sub GridView1_RowDeleting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles GridView1.RowDeleting 
     BindGrid() 
     Dim oDv As DataView = GridView1.DataSource 
     oDv.Delete(GridView1.Rows(e.RowIndex).RowIndex) 
     oDv.DataViewManager.DataSet.WriteXml(Request.PhysicalApplicationPath + "Event_Info.xml", XmlWriteMode.WriteSchema) 
     oDv.Sort = "Date desc" 
     BindGrid() 
    End Sub 

Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating 
     ' Get the new values from the GridView controls 
     Dim i As Integer = GridView1.Rows(e.RowIndex).DataItemIndex 
     Dim n As String = CType(GridView1.Rows(e.RowIndex).Cells(0).Controls(0), TextBox).Text 
     Dim rn As String = CType(GridView1.Rows(e.RowIndex).Cells(1).Controls(0), TextBox).Text 

     GridView1.EditIndex = -1 
     BindGrid() 
     ' Update the XML file using the new values 

     Dim oDv As DataView = GridView1.DataSource 
     oDv.DataViewManager.DataSet.Tables(0).Rows(i).Item(0) = n 
     oDv.DataViewManager.DataSet.Tables(0).Rows(i).Item(1) = rn 
     oDv.DataViewManager.DataSet.WriteXml(Request.PhysicalApplicationPath + "Event_Info.xml", XmlWriteMode.WriteSchema) 
     BindGrid() 
    End Sub 

Natürlich, wie in den Kommentaren vorgeschlagen wurde, habe ich ein XML-Schema definiert, um sicherzustellen, dass die Datumsspalte in geschrieben werden würde/lesen von der xML-Daten als Datum

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="EventsSchema" 
    targetNamespace="http://tempuri.org/EventsSchema.xsd" 
    elementFormDefault="qualified" 
    xmlns="http://tempuri.org/EventsSchema.xsd" 
    xmlns:mstns="http://tempuri.org/EventsSchema.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
> 

    <xs:element name="Notification"> 
    <xs:complexType> 
     <xs:sequence> 

     <xs:element name="Info" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
      <xs:sequence> 

       <xs:element name="Event" type="xs:string"></xs:element> 
       <xs:element name="Date" type="xs:dateTime"></xs:element> 

      </xs:sequence> 
      </xs:complexType> 
     </xs:element> 

     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 
</xs:schema>