IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Databinding et EF4.1


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut Databinding et EF4.1
    Bonsoir,
    J’aurais besoin d’un peu d’aide (lien ou autre) pour me dépatouiller de mon problème !
    J’utilise EF 4.1.0 pour accéder à une base SQL Server, j’ai crée mon model et j’aimerais binder une requête sur un DGV

    Définition du context + variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Dim ctx As New PhilaEntities ' fermé à la fermeture du Form par "ctx.Dispose()"
        Dim CivToDelete As Civilite  ' utilisé pour suppression directe sur ligne du DGV
    Je charge le bindingsource
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         ctx.Civilites.Load()
          CiviliteBindingSource.DataSource = ctx.Civilites.Local
    Quelle est la meilleure solution pour « charger » le résultat d’une requete, faire un list(of ) ou un ObjectResult(Of ) ??

    J’ai un bouton save
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            CiviliteDataGridView.EndEdit()
            CiviliteBindingSource.EndEdit()
            Try
                ctx.SaveChanges()
            Catch ex As Exception
                MessageBox.Show("erreur dans le savechange = " & e.ToString)
            End Try
    Une fonction pour supprimer directement depuis la ligne du DGV
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        Private Sub CiviliteDataGridView_UserDeletedRow(sender As Object, e As System.Windows.Forms.DataGridViewRowEventArgs) Handles CiviliteDataGridView.UserDeletedRow
            If True Then
                If CivToDelete IsNot Nothing Then
                    ctx.Civilites.Remove(CivToDelete)
                    CivToDelete = Nothing
                End If
            End If
        End Sub
     
    Private Sub CiviliteDataGridView_UserDeletingRow(sender As Object, e As System.Windows.Forms.DataGridViewRowCancelEventArgs) Handles CiviliteDataGridView.UserDeletingRow
            CivToDelete = TryCast(CiviliteBindingSource.Current, Civilite)
        End Sub

    Et un bouton delete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            If MessageBox.Show("Etes vous sûr de vouloir supprimer cette ligne ?", "", MessageBoxButtons.YesNo) = Windows.Forms.DialogResult.Yes Then
                CiviliteBindingSource.RemoveCurrent()
            End If
    Résultats :
    - Ajouts / modifs : pas de pb
    - si je supprime une ou plusieurs lignes directement sur le DGV puis save : pas de pb
    - si je sélectionne une ligne sur le DGV et que je clique sur delete, la ligne se supprime du DGV mais le save ou ne remplit pas sa fonction ou me génère une erreur System.EventArgs

    Bref tout conseil sera le bienvenu !
    Bertrand

  2. #2
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    Bonjour,
    En fait, j'ai trouvé la solution au pb de suppression : j'avais gardé le Btn généré par le BindingNavigator qui supprime déjà une ligne -> en ajoutant une suppression, j'en supprimais en fait 2 dont 1 qui n'était pas "factice" et j'avais une erreur signalant que je voulais supprimer une info liée à une autre table

    Par contre, je n'ai pas encore trouvé comment lier le binding source à une requête LINQ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ctx.Civilites.Load()   
    CiviliteBindingSource.DataSource = ctx.Civilites.Local ' ou ".ToBindingList"
    Marche mais ne me permets pas de trier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ctx.Civilites.Load() 
    CiviliteBindingSource.DataSource = ctx.Civilites.Local.OrderBy(Function(d) d.Libelle)
    Marche mais ne permet pas d'ajout

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
           Dim CiviliteQuery As ObjectQuery(Of Civilite) = From c _
                                                            In ctx.Civilites _
                                                            Order By c.Libelle _
                                                            Select c
            CiviliteBindingSource.DataSource = CiviliteQuery.Execute(MergeOption.AppendOnly)
    trouvé sur msdn ne marche pas, erreur =
    Impossible d'effectuer un cast d'un objet de type 'System.Data.Entity.Infrastructure.DbQuery`1[Phila_Model.Civilite]' en type 'System.Data.Objects.ObjectQuery`1[Phila_Model.Civilite]'.


    Une idée ?
    Par avance, merci
    Bertrand

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Le mieux quand même est de créer des classes ou t'auras tout le code d'accès à ta bdd (CRUD: création, lecture, mise à jour et suppression) et c'est les méthodes de cette classe que tu devras appeler plutôt que tout faire dans ta form (tu peux aller plus loin encore en appliquant un pattern MVC ou autre).

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    Re bonjour et merci pour la réponse !

    Pour charger le datagridview à partir d'une requête, j'ai "enfin" trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            Dim query = From c In ctx.Civilites
                Where c.Libelle.Length > 2
                Order By c.Libelle
                Select c
            query.Load()
            CiviliteBindingSource.DataSource = ctx.Civilites.Local.ToBindingList
    ça marche : modif, ajout, suppression,.. mais après pas mal de recherches, je n'ai pas trouvé le moyen de recharger la liste pour l'avoir à nouveau classée selon le critère choisi (j'ai essayé de supprimer le bindingsource et le recréer, idem sur le datasource,..) je crois qu'il faudrait disposer le Dbcontext et en créer un nouveau, mais alors le DGV envoie une flopée d'erreurs

    Pour en revenir à la réponse de youtpout978, je ne suis pas sûr d'avoir compris (je suis débutant)
    - dois je créer par classe (j'en aurais plus de 100) les méthodes add, delete ?
    - dois je créer une classe générique, comme celle trouvée à http://www.tcscblog.com/2012/06/22/e...ic-repository/ (bien entendu en C# :-( )? ou alors trouver un Template qui les génère ?
    - cette approche est elle cohérente avec dBcontext (tracking,base locale,..) ? ou plus "basique" mais plus efficace (au vu de mes déboires pour binder EF)
    - au niveau binding, on utiliserait alors un list(of class) ?

    désolé du nombre de questions, et surement de la stupidité de certaines, mais je patauge grave !
    Par avance, merci
    Bertrand

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Oui tu peux créer une classe comme montré dans ton lien, je pense que tu peux utiliser des templates étant donné que tu veux faire ça pour une centaine de classe mais je ne sais pas comment le mettre en œuvre.

    Tu as une centaine de table dans ta base de donnée ?

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Par défaut
    Re,
    Et oui et même plus car je veux migrer un base Access ou j'ai exploité à fond la notion de "base relationnelle", j'ai donc "découpé" à mort
    Je me vois mal écrire la même chose plus d'une centaine de fois !
    c'est pourquoi, j'étais parti sur EF
    Bertrand

Discussions similaires

  1. [VB.NET][ADO.NET] DataBindings et Relations
    Par DotNET74 dans le forum Accès aux données
    Réponses: 4
    Dernier message: 21/07/2005, 15h58
  2. Réponses: 4
    Dernier message: 09/05/2005, 21h01
  3. [VB.NET] Le DataBinding en vb.net, c'est comment?
    Par Pleymo dans le forum ASP.NET
    Réponses: 11
    Dernier message: 04/02/2005, 14h14
  4. [VB.NET][DataBinding] Rafraichissement DataGrid lié à un obj
    Par speedy1496 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 21/10/2004, 10h15
  5. [C#] Problème de DataBinding
    Par bilb0t dans le forum ASP.NET
    Réponses: 4
    Dernier message: 08/10/2004, 11h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo