2016-07-29 2 views
0

В конечном счете, я пытаюсь найти способ успешно сортировать и фильтровать данные xml на экране gridview.фильтрация и сортировка данных xml по дате в vb.net

У меня есть XML-лист, как это:

<?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> 

Что мне нужно фильтровать и сортировать в asp.net GridView на двух разных страницах. На одной странице я храню большую запись обо всех событиях и позволяю добавлять, обновлять и удалять записи. Второй gridview находится в углу моей главной страницы, который должен показывать текущие/предстоящие события. Я определяю их как так (2-я один имеет меньшие размеры размер, но это единственное отличие):

<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> 

Я использую эту функцию vb.net, чтобы связать мои данные XML в моей GridView

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 

Моя проблема заключается в том, что всякий раз, когда я читаю данные xml или пытаюсь загрузить его с помощью Dim doc as XDocument=XDocument.Load("Path to my xml"), данные, считанные внутри, являются строкой в ​​столбце даты, поэтому единственный способ найти их - это изменить мой BindGrid() функционируют так:

Private Sub BindGrid() 

      Dim ds As New DataSet 
      ds.Tables[0].DefaultView.Sort = "Date desc" 
      ds.ReadXml(Server.MapPath("~/Event_Info.xml")) 
      GridView1.DataSource = ds.Tables[0].DefaultView 
      GridView1.DataBind() 
      GridView1.HeaderRow.TableSection = TableRowSection.TableHeader 

     End Sub 

Это позволило мне отсортировать, если я только ввел дату yyyy/mm/dd, но мои функции добавления, удаления и обновления больше не работали.

, если вы хотите увидеть их, я буду размещать их здесь, но вы могли бы, вероятно, пропустить этот бит: Button_click здесь наверху для добавления записи в 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 

Завершить бит пропуска

Я также не знаю, как успешно фильтровать данные на главной странице, чтобы отображать только текущие и будущие события. Я пытался найти способы применить «где» пункт своего рода на сегодняшний день, но не увенчались успехом

Edit: отмеченный раздел как код, который я забыл пометить как код

+0

Начните с написания схемы в XML-файле, чтобы она включала дату в качестве фактической даты. Затем, когда вы читаете файл, он также будет Date: oDs.WriteXml (Request.PhysicalApplicationPath + «Event_Info.xml», XmlWriteMode.WriteSchema). Также исправьте GridView1_RowUpdating, чтобы вы записывали DateTime во второй столбец вместо строки. текстовое поле должно быть строкой bu, а не DataTable или DGV. – jdweng

+0

@jdweng Спасибо, это помогло мне разобраться, как писать схему, и помогло мне решить некоторые проблемы в этой проблеме. – MacedonZero

ответ

0

Я нашел решение к моей проблеме. Мне нужно было использовать dataviews вместо наборов данных для изменения, сортировки и фильтрации моих данных.

Моя функция bindgrid стала этим:

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 

ПримечаниеЭтот больше изменения означает, что функции моего добавление/удаление/обновление должны были измениться. Я закончил тем, что писал их, как это, если кто-то хочет, чтобы их увидеть:

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 

Конечно, как это было предложено в комментариях, я определил схему XML, чтобы гарантировать, что столбец дата будет записан в/чтения из xml данные как дата

<?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> 
Смежные вопросы