Précédent   Forum des professionnels en informatique > Dotnet > Accès aux données > Linq
Linq Forum d'entraide sur la manipulation de données avec Linq
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/01/2012, 22h16   #1
Membre confirmé
 
Homme Toto Browny
Développeur informatique
Inscription : mars 2008
Messages : 198
Détails du profil
Informations personnelles :
Nom : Homme Toto Browny
Âge : 31
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Distribution

Informations forums :
Inscription : mars 2008
Messages : 198
Points : 206
Points : 206
Par défaut 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!
__________________
Créateur de bugs professionnel
Ma philosophie en 4 temps:
-Ce n'est qu'en essayant continuellement que l'on finit par réussir.
-Plus ça rate, plus on a de chances que ça marche.
-Ne jamais révéler tout son savoir
-...
BROWNY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/01/2012, 08h32   #2
Nouveau Membre du Club
 
Homme Alex Hu
Développeur Java
Inscription : août 2011
Messages : 15
Détails du profil
Informations personnelles :
Nom : Homme Alex Hu
Localisation : Chine

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : août 2011
Messages : 15
Points : 25
Points : 25
Bonjour BROWNY,

Tu as affiché beaucoup de code, pourrais-tu simplifier ta question?
Alex Hu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 09h01   #3
Membre confirmé
 
Homme Toto Browny
Développeur informatique
Inscription : mars 2008
Messages : 198
Détails du profil
Informations personnelles :
Nom : Homme Toto Browny
Âge : 31
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Distribution

Informations forums :
Inscription : mars 2008
Messages : 198
Points : 206
Points : 206
C'est bon j'ai trouvé!!!

En résumé
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}
me servait à remplir un repeater. Mais j'avis besoin de la même source pour remplir un dropdownlist.

Perso, je ne suis pas fan du copier/coller. J'aime bien des fonctions et que mon code soit bien organisé. Je suis même un peu maniac

La solution :
1) une classe de retour
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
 
Imports Microsoft.VisualBasic
 
Public Class MesClasses
 
    Public Class Theme
        Private _Id As Integer
        Public Property Id As Integer
            Get
                Return _Id
            End Get
            Set(value As Integer)
                _Id = value
            End Set
        End Property
 
        Private _Libelle As String
        Public Property Libelle As String
            Get
                Return _Libelle
            End Get
            Set(value As String)
                _Libelle = value
            End Set
        End Property
 
    End Class
 
End Class
2) une classe utilitaire
Code :
1
2
3
4
5
6
7
8
9
10
 
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") Order By xe.Element("Libelle").Value Select New MesClasses.Theme With {.Id = xe.Attribute("Id").Value, .Libelle = xe.Element("Libelle").Value}).ToList
    End Function
 
End Class
3) l'appel de n'importe où de mon projet
Code :
1
2
 
rpt.datasource=Helper.GetLstTheme(doc)
Comme ça, j'ai toujours en retour une liste de MesClasses.Theme, une classe que je connais très bien et que je maîtrise.

En espérant que ce code serve aux néophites comme moi qui peuvent passer des heures pour pondre à la fin 4 lignes

Mais je peux crier VICTOIRE!!!!!!
__________________
Créateur de bugs professionnel
Ma philosophie en 4 temps:
-Ce n'est qu'en essayant continuellement que l'on finit par réussir.
-Plus ça rate, plus on a de chances que ça marche.
-Ne jamais révéler tout son savoir
-...
BROWNY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/01/2012, 12h58   #4
Membre expérimenté
 
Homme Gilles Vino
Software Developer
Inscription : mars 2008
Messages : 506
Détails du profil
Informations personnelles :
Nom : Homme Gilles Vino
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Software Developer

Informations forums :
Inscription : mars 2008
Messages : 506
Points : 514
Points : 514
Bonjour BROWNIE,

Pour info tu peux remplacer cela:
Code :
1
2
3
4
5
6
7
8
Public Property Id As Integer
            Get
                Return _Id
            End Get
            Set(value As Integer)
                _Id = value
            End Set
        End Property
par
Code :
Public Property Id As Integer
et supprimer "_id" puisque tu ne l'utilise jamais pour faire de vérification.

Par ailleurs pourquoi n'utilises-tu pas le code que je t'ai fournie dans un de tes autres thread? Beaucoup plus simple et aucun risque d'erreur (je trouve que écrire le nom des noeuds xml et des attributs est une tres mauvaise pratique, tu peux utiliser l'Intellisence, plus rapide, plus simple, aucun risque d'erreur).

A+
alex_vino est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/01/2012, 15h00   #5
Membre confirmé
 
Homme Toto Browny
Développeur informatique
Inscription : mars 2008
Messages : 198
Détails du profil
Informations personnelles :
Nom : Homme Toto Browny
Âge : 31
Localisation : France, Haute Vienne (Limousin)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Distribution

Informations forums :
Inscription : mars 2008
Messages : 198
Points : 206
Points : 206
Merci pour la simplification de la syntaxe..

Pour ton exemple... je dois être un peu boulet, je ne le retrouve pas
__________________
Créateur de bugs professionnel
Ma philosophie en 4 temps:
-Ce n'est qu'en essayant continuellement que l'on finit par réussir.
-Plus ça rate, plus on a de chances que ça marche.
-Ne jamais révéler tout son savoir
-...
BROWNY est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 17h55   #6
Membre expérimenté
 
Homme Gilles Vino
Software Developer
Inscription : mars 2008
Messages : 506
Détails du profil
Informations personnelles :
Nom : Homme Gilles Vino
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Software Developer

Informations forums :
Inscription : mars 2008
Messages : 506
Points : 514
Points : 514
Peut etre qu'ils l'ont modifiés ou renommé alors, je vais voir si je le trouve pas chez moi, si je le trouve je te l'enverrais

A+
alex_vino est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h33.


 
 
 
 
Partenaires

Hébergement Web