Napisany przez: kepler22b 29.05.2015, 20:31:25
Witam,
Proszę o wyjaśnienie lub podesłanie odpowiedniej lektury, gdyż spędziłem 3 dni szukając w google.
Chciałbym za pomocą 2 lub 3 dropdownlist odfiltrować dane XML'a, których wynik będzie wyświetlany w GridView.
np:
mając zbiór książek, wybierając z listy "Fizyka", należy wybrać w kolejnej liście poziom zaawansowania np "średni", w 3 liście np rok wydania.
Po dokonaniu pierwszego wyboru lista w Gridzie powinna się zawężyć, po kolejnym wyborze lista powinna się zawężyć jeszcze bardziej, itd. do dokonania ost. wyboru.
Projekt tworzę w Visual Studio 2008 w XML'u oraz C#
Z góry dziękuje ja wszelkie sugesię.
Napisany przez: Pyton_000 30.05.2015, 10:31:15
Na moje oko słowem kluczowym tutaj będzie XPath.
Mając strukturę XML za pomocą XPath odfiltrujesz sobie dane, musisz go tylko sobie wygenerować doklejając kolejne warunki np.
Kod
/book[@przedmiot="Fizyka"][@poziom="średniozaawansowany"][@rok="2014"]
https://msdn.microsoft.com/en-us/library/ms256086%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
Napisany przez: kepler22b 31.05.2015, 07:58:00
Hej, dzieki za odpowiedź.
Zrobiłem małe postępy, niestaty nadal mam pewien problem..
używając poniższego kodu, po wyborze działu: Fizyka dane zostają odfiltrowane, ale po wyborze kolejnej warości z listy: poziom, np. Podstawowy, wartości są wyświetlane dla Poziomu, czyli wybierając poziom Podstawowy pojawiają się wartości dla wielu przedmiotów.
W skrócie wartości są filtrowane po wartościach tylko z jednej kolumny.
Próbowałem kombinować w kodzie List, ale bez rezultatu.
XML
CODE
<?xml version="1.0" encoding="utf-8" ?>
<elementarz>
<ksiazka id="1" dzial="Fizyka">
<poziom>Podstawowy</poziom>
<autor>Jan Kowalski</autor>
<tytul>Fale dzwiekowe</tytul>
<wydawnictwo>Warszawa</wydawnictwo>
<rok>2013</rok>
</ksiazka>
<ksiazka id="2" dzial="Fizyka">
<poziom>Zaawansowany</poziom>
<autor>Jan Zimny</autor>
<tytul>Grawitacja</tytul>
<wydawnictwo>Krakow</wydawnictwo>
<rok>2012</rok>
</ksiazka>
<ksiazka id="3" dzial="Matematyka">
<poziom>Zaawansowany</poziom>
<autor>Piotr Kordus</autor>
<tytul>Pitagoras</tytul>
<wydawnictwo>Poznan</wydawnictwo>
<rok>2010</rok>
</ksiazka>
<ksiazka id="4" dzial="Angielski">
<poziom>Zaawansowany</poziom>
<autor>Piotr Rukat</autor>
<tytul>Easy jezyk</tytul>
<wydawnictwo>Wroclaw</wydawnictwo>
<rok>2010</rok>
</ksiazka>
<ksiazka id="5" dzial="Angielski">
<poziom>Podstawowy</poziom>
<autor>Lukasz Rej</autor>
<tytul>Ucy sie jezyka</tytul>
<wydawnictwo>Gdansk</wydawnictwo>
<rok>2011</rok>
</ksiazka>
<ksiazka id="6" dzial="Angielski">
<poziom>Sredni</poziom>
<autor>Lukasz Rej</autor>
<tytul>Ucy sie jezyka</tytul>
<wydawnictwo>Gdansk</wydawnictwo>
<rok>2011</rok>
</ksiazka>
<ksiazka id="7" dzial="Chemia">
<poziom>Zaawansowany</poziom>
<autor>Ewa Kot</autor>
<tytul>Chemia jest super</tytul>
<wydawnictwo>Wroclaw</wydawnictwo>
<rok>2010</rok>
</ksiazka>
<ksiazka id="8" dzial="Chemia">
<poziom>Podstawowy</poziom>
<autor>Lukasz Rym</autor>
<tytul>Ucy sie chemii</tytul>
<wydawnictwo>Gdansk</wydawnictwo>
<rok>2011</rok>
</ksiazka>
<ksiazka id="9" dzial="Chemia">
<poziom>Sredni</poziom>
<autor>Lech Adamek</autor>
<tytul>Chemia</tytul>
<wydawnictwo>Gdansk</wydawnictwo>
<rok>2011</rok>
</ksiazka>
</elementarz>
CODE
C#
using System;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
public void ZmienTematyke(object sender, EventArgs e)
{
ddlPoziom.SelectedIndex = -1;
string dzial = ddlTematyka.SelectedItem.Value;
if(dzial != string.Empty)
{
XmlDataSource1.XPath = "/elementarz/ksiazka[ @dzial='" + dzial + "']";
}
else
{
XmlDataSource1.XPath = "/elementarz/ksiazka";
}
}
public void ZmienPoziom(object sender, EventArgs e)
{
ddlTematyka.SelectedIndex = -1;
string poziom = ddlPoziom.SelectedItem.Value;
if (poziom != string.Empty)
{
XmlDataSource1.XPath = "/elementarz/ksiazka[][poziom='" + poziom + "']";
}
else
{
XmlDataSource1.XPath = "/elementarz/ksiazka";
}
}
public void ZmienWydawnictwo(object sender, EventArgs e)
{
string wydawnictwo = ddlWydawnictwo.SelectedItem.Value;
if (wydawnictwo != string.Empty)
{
XmlDataSource1.XPath = "/elementarz/ksiazka[ wydawnictwo='" + wydawnictwo + "']";
}
else
{
XmlDataSource1.XPath = "/elementarz/ksiazka";
}
}
}
CODE
ASPX:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!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>
</head>
<body>
<form id="form1" runat="server">
<asp:DropDownList ID="ddlTematyka" runat="server"
OnSelectedIndexChanged="ZmienTematyke" AutoPostBack="True">
<asp:ListItem Text="Tematyka" Value=""/>
<asp:ListItem Text="Angielski" Value="Angielski"/>
<asp:ListItem Text="Chemia" Value="Chemia"/>
<asp:ListItem Text="Matematyka" Value="Matematyka"/>
<asp:ListItem Text="Informatyka" Value="Informatyka"/>
<asp:ListItem Text="Fizyka" Value="Fizyka"/>
</asp:DropDownList>
<asp:DropDownList ID="ddlPoziom" runat="server" OnSelectedIndexChanged="ZmienPoziom" AutoPostBack="true">
<asp:ListItem Text="Poziom" Value=""/>
<asp:ListItem Text="Podstawowy" Value="Podstawowy"/>
<asp:ListItem Text="Sredni" Value="Sredni"/>
<asp:ListItem Text="Zaawansowany" Value="Zaawansowany"/>
</asp:DropDownList>
<asp:DropDownList ID="ddlWydawnictwo" runat="server" OnSelectedIndexChanged="ZmienWydawnictwo" AutoPostBack="true">
<asp:ListItem Text="Wydawnictwo" Value=""/>
<asp:ListItem Text="Krakow" Value="Krakow"/>
<asp:ListItem Text="Wroclaw" Value="Wroclaw"/>
<asp:ListItem Text="Gdansk" Value="Gdansk"/>
</asp:DropDownList>
<p> </p>
<asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/App_Data/ksiazki.xml"></asp:XmlDataSource>
<asp:GridView ID="GridView1" runat="server" XPath="/elementarz/ksiazka" AutoGenerateColumns="False" DataSourceID="XmlDataSource1"> <Columns>
<asp:BoundField DataField="id" HeaderText="id" SortExpression="id" />
<asp:BoundField DataField="dzial" HeaderText="dzial" SortExpression="dzial" HeaderStyle-Width="150"/>
<asp:TemplateField HeaderText="Poziom" HeaderStyle-Width="150"><ItemTemplate>
<%# XPath("poziom")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Autor" HeaderStyle-Width="150"><ItemTemplate>
<%# XPath("autor")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Tytul" HeaderStyle-Width="200"><ItemTemplate>
<%# XPath("tytul")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Wydawnictwo" HeaderStyle-Width="150"><ItemTemplate>
<%# XPath("wydawnictwo")%>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Rok" HeaderStyle-Width="150"><ItemTemplate>
<%# XPath("rok")%>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</form>
</body>
</html>
Napisany przez: Pyton_000 31.05.2015, 09:08:05
Nie odfiltrowuje bo warunki musisz doklejać do siebie. Ty zaś zamieniasz czyli najpierw masz:
-
Kod
XmlDataSource1.XPath = "/elementarz/ksiazka[ @dzial='" + dzial + "']";
Potem masz:
Kod
XmlDataSource1.XPath = "/elementarz/ksiazka[][poziom='" + poziom + "']";
A powinieneś mieć:
Kod
XmlDataSource1.XPath = "/elementarz/ksiazka[ @dzial='" + dzial + "'][poziom='" + poziom + "']";