Fonction pour une liste avec XML to Linq
Bonjour,
J'appelle à votre aide, j'ai encore beaucoup de mal à me faire avec la syntaxe du Linq. Mon projet est de faire une dictionnaire de vidéo pour l'apprentissage du LSF (dans le style de sématos) pour mon usage perso.
Pour faire simple, j'ai décidé de mettre mes infos dans un fichier xml.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
<?xml version="1.0" encoding="utf-8"?>
<BDD>
<Themes>
<Theme Id="1">
<Libelle>
Religion
</Libelle>
</Theme>
<Theme Id="2">
<Libelle>
Personnage
</Libelle>
</Theme>
<Theme Id="3">
<Libelle>
Sentiment
</Libelle>
</Theme>
<Theme Id="4">
<Libelle>
Animal
</Libelle>
</Theme>
<Theme Id="5">
<Libelle>
Date
</Libelle>
</Theme>
<Theme Id="6">
<Libelle>
Civilité
</Libelle>
</Theme>
<Theme Id="7">
<Libelle>Mesure</Libelle>
</Theme>
</Themes>
</BDD> |
Voici mon code qui marche bien (affichage dans un répéteur, ajout et suppression dans le fichier xml)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
Partial Class GestionVideo
Inherits System.Web.UI.Page
Dim doc As XDocument = Nothing
Dim PathBdd As String = Server.MapPath("~/Data/Bdd.xml")
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
doc = XDocument.Load(PathBdd)
If Not Page.IsPostBack Then
BindThemes()
End If
End Sub
#Region "Themes"
Private Sub BindThemes()
Dim qList = From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Select New With _
{.Id = xe.Attribute("Id").Value, _
.Libelle = xe.Element("Libelle").Value} 'Helper.GetLstTheme(doc)
rptThemes.DataSource = qList.ToList
rptThemes.DataBind()
End Sub
Protected Sub btnAddTheme_Click(sender As Object, e As System.Web.UI.ImageClickEventArgs) Handles btnAddTheme.Click
If txtId.Text.Trim.Length > 0 AndAlso txtLib.Text.Trim.Length Then
doc = XDocument.Load(Server.MapPath("~/Data/Bdd.xml"))
Dim qTargetDept As XElement = doc.Elements("BDD").FirstOrDefault
Dim oEmp As New XElement("Theme")
oEmp.Add(New XAttribute("Id", txtId.Text))
oEmp.Add(New XElement("Libelle", txtLib.Text))
qTargetDept.Element("Themes").Add(oEmp)
doc.Save(PathBdd)
BindThemes()
txtId.Text = ""
txtLib.Text = ""
End If
End Sub
Protected Sub rptThemes_ItemCommand(source As Object, e As System.Web.UI.WebControls.RepeaterCommandEventArgs) Handles rptThemes.ItemCommand
If e.CommandName = "DEL" Then
Dim qEmp As XElement = doc.Descendants.Elements("Themes").Elements("Theme").Where(Function(xe) xe.Attribute("Id").Value = e.CommandArgument).FirstOrDefault()
qEmp.Remove()
doc.Save(PathBdd)
BindThemes()
End If
End Sub
#End Region
End Class |
page aspx
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="GestionVideo.aspx.vb" Inherits="GestionVideo" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<link rel="stylesheet" type="text/css" href="CSS/MaCss.css" />
</head>
<body>
<form id="form1" runat="server">
<ajax:ToolkitScriptManager ID="ScriptManager1" runat="server">
</ajax:ToolkitScriptManager>
<div>
<asp:Panel ID="pnlClick" runat="server" CssClass="pnlCSS">
<asp:Label ID="lblMessage" runat="server" Text="Gestion des thèmes" />
<asp:Image ID="imgArrows" runat="server" />
</asp:Panel>
<asp:Panel ID="pnlCollapsable" runat="server">
<table>
<tr class="cpHeader">
<td>
Id
</td>
<td>
Libellé
</td>
<td>
</td>
</tr>
<asp:Repeater ID="rptThemes" runat="server">
<ItemTemplate>
<tr>
<td>
<%# Eval("Id") %>
</td>
<td>
<%# Eval("Libelle") %>
</td>
<td>
<asp:ImageButton ID="btnSupp" runat="server" ImageUrl="~/Images/Poubelle.png" CommandName="DEL" CommandArgument='<%# Bind("Id") %>'/>
<ajax:ConfirmButtonExtender ID="confbtn" runat="server" TargetControlID="btnSupp" ConfirmText="Etes-vous sûr de vouloir supprimer cet élément?">
</ajax:ConfirmButtonExtender>
</td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr>
<td>
<%# Eval("Id") %>
</td>
<td>
<%# Eval("Libelle") %>
</td>
<td>
<asp:ImageButton ID="btnSupp" runat="server" ImageUrl="~/Images/Poubelle.png" CommandName="DEL" CommandArgument='<%# Bind("Id") %>'/>
<ajax:ConfirmButtonExtender ID="confbtn" runat="server" TargetControlID="btnSupp" ConfirmText="Etes-vous sûr de vouloir supprimer cet élément?">
</ajax:ConfirmButtonExtender>
</td>
</tr>
</AlternatingItemTemplate>
</asp:Repeater>
<tr class="cpFooter">
<td>
<asp:TextBox ID="txtId" runat="server"></asp:TextBox>
</td>
<td>
<asp:TextBox ID="txtLib" runat="server"></asp:TextBox>
</td>
<td>
<asp:ImageButton ID="btnAddTheme" runat="server" ImageUrl="~/Images/Plus.png" />
</td>
</tr>
</table>
</asp:Panel>
<ajax:CollapsiblePanelExtender ID="CollapsiblePanelExtender1" runat="server" CollapseControlID="pnlClick"
Collapsed="true" ExpandControlID="pnlClick" TextLabelID="lblMessage" ImageControlID="imgArrows"
CollapsedImage="~/Images/Fleche_Bas.jpg" ExpandedImage="~/Images/Fleche_Haut.jpg"
ExpandDirection="Vertical" TargetControlID="pnlCollapsable" ScrollContents="false">
</ajax:CollapsiblePanelExtender>
</div>
</form>
</body>
</html> |
Maintenant, je souhaiterai mutualiser
Code:
1 2 3 4
|
Dim qList = From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Select New With _
{.Id = xe.Attribute("Id").Value, _
.Libelle = xe.Element("Libelle").Value} |
Pour pouvoir réutilser dans plusieurs listes différentes sans devoir faire de l'aborieux copier/coller
Voici une tentative qui ne fonctionne pas (une parmi tant d'autre)
Dans fichier de class
Code:
1 2 3 4 5 6 7 8 9 10 11
|
Imports Microsoft.VisualBasic
Public Class Helper
'Public Shared Function GetLstTheme(ByVal doc As XDocument) As List(Of MesClasses.Theme)
' Return (From xe As System.Xml.Linq.XElement In doc.Descendants.Elements("Themes").Elements("Theme") Select New With _
' {.Id = xe.Attribute("Id").Value, _
' .Libelle = xe.Element("Libelle").Value}).ToList
'End Function
End Class |
Mesclass.vb
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
Imports Microsoft.VisualBasic
Public Class MesClasses
'Public Class Customer
' public int ID { get; set;
' public string Forename get; set; }
' public string Surname { get; set; }
'public string DOB { get; set; }
' public string Location { get; set; }
' End Class
Public Class Theme
Public Id As Integer
Public Libelle As String
End Class
End Class |
Merci d'avance, pour tout conseil!