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

ASP.NET Discussion :

[VB.NET] chargement d'un datagrid avec un dataset vide


Sujet :

ASP.NET

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut [VB.NET] chargement d'un datagrid avec un dataset vide
    Bonjour à tous et à toutes,

    Voici mon problème : j'ai une fonction qui me permet de charger un datagrid avec un dataset. Le datagrid permet d'ajouter un item dans son footer. Cette fonction gère également la mise à jour de l'index en cas d'édition d'une ligne du datagrid. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    Sub SqlDataGridIndex(ByVal DG As DataGrid, ByVal DA As SqlDataAdapter, Optional ByVal key As String = "", Optional ByVal index As Integer = 0)
     
            Dim DS As New DataSet
            DA.Fill(DS)
            If DS.Tables.Count <> 0 Then
                DG.DataSource = DS
                If key.Length <> 0 Then
                    DG.EditItemIndex = index
                    DG.DataKeyField = key
                End If
                DG.DataBind()
            End If
     
     
     End Sub
    Mon problème c'est que qd le dataset est vide j'ai une erreur au niveau du databind, c'est pourquoi je fais le test avant de binder. Le problème c'est que s'il n'y a pas de databind (car le dataset est vide), le datagrid ne s'affiche pas du tout et donc je peux pas ajouter grâce au footer. En résumé je suis d'abord obligée de sélectionner des lignes avant de pouvoir en rajouter
    Vous me direz qu'il suffit de créer une datatable pour mon dataset. Le problème c'est que ses colonnes devront correspondre au datagrid et donc ma fonction ne marchera plus que pour un datagrid

    Ce que je trouve dommage c'est qu'avec un datareader je n'ai pas ce problème : même si le datareader n'a pas de résultat, le databind ne provoque pas d'erreur et donc j'ai au moins le header et le footer de mon datagrid qui s'affichent. Malheureusement avec le datareader ce sont les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    If key.Length <> 0 Then
                    DG.EditItemIndex = index
                    DG.DataKeyField = key
    End If
    qui posent un problème d'ouverture de reader

    une idée pour moi siouplait merci d'avance

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Ben eu... je sais pas trop, quelle est l'erreur que tu as avec un DataSet vide ? Je ne vois pas bien à quoi sert ta fonction sinon.

    Pour l'erreur sur le DG.EditItemIndex en cas de DataReader vide ça ne m'etonne pas trop, si ta grid est vide (surtout avant d'avoir bindé) et que tu donnes un index hors limite, j'imagine que tu as une erreur.

  3. #3
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    Si le dataset est vide j'ai cette erreur là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    Le IListSource ne contient pas de source de données. 
    Description : Une exception non gérée s'est produite au moment de l'exécution de la demande Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. 
     
    Détails de l'exception: System.Web.HttpException: Le IListSource ne contient pas de source de données.
     
    Erreur source: 
     
     
    Ligne 53 :             DG.DataKeyField = key
    Ligne 54 :         End If
    Ligne 55 :         DG.DataBind()
    Ligne 56 :         ' End If
    Ligne 57 :

    Ma fonction elle me sert à éviter de recoder à chaque fois, la mise à jour du datasource, la mise à jour de l'index du datagrid et le databind.

    Pour le problème du reader avec DG.EditItemIndex, c'est pas que le reader est vide, c'est qu'à priori il tente d'utiliser un autre reader pour effectuer les lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DG.EditItemIndex = index
    DG.DataKeyField = key
    Car si je les enlève de mon code, pas de problème (à part que l'index est pas à jour, ca tu l'auras compris ), et si je les remets, j'ai l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ... un datareader est déjà associé à cet connexion ....

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Pour la DataSet je sais pas trop encore une fois, apparemment il accepte pas un DataSet vide, ce qui peut se comprendre, mais toi si je comprends bien tu as au moins besoin de binder afin que la Grid s'affiche... Peut etre simplement qu'un truc de ce genre marcherait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if( DS est vide )
    {
       ArrayList AL = new ArrayList();
       DG.DataSOurce = AL;
    }
    else
    {
        DG.DataSource = DS;
    }
     
    DG.DataBind();
    Ok c'est une bidouille, mais essaye, on sait jamais .

    Pour ton autre erreur c'est louche, je me demande si tu n'aurai pas oublié de fermer un DataReader précedemment par exemple...


    PS : je n'ai jamais bindé de DataSet à une grid, mais plutot une DataTable. Asp.Net fait quoi qd tu bind à un DataSet, il prend la premiere table par defaut ?

  5. #5
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    270
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 270
    Points : 92
    Points
    92
    Par défaut
    ENNNNNNNNNOOOOOOORRRRRRRRRRMMMMMMMMMMEEE

    en fait ta solution marche et du coup j'ai testé avec une datatable vide et ca marche aussi !!!! Comme je le disais dans le début du post, j'étais persuadée que ça ne passerait pas au mapping (entre une datatable vide et un datagrid dont les colonnes sont connues), du coup j'avais même pas testé :idc:

    Ca marche, donc c'est cool

    GRAND MERCI !!!!!

    Sinon, pour le datareader, j'ai fait une exécution pas à pas, le reader qui est ouvert c'est celui pour la mise à jour du datasource, mais je comprends pas pkoi ça cherche à en ouvrir un deuxième

    Sinon pour info : oui à priori il prend la première table du DS

    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/07/2009, 13h20
  2. [VB.NET]Probleme datagrid avec checkbox et pagination
    Par junoreactor dans le forum ASP.NET
    Réponses: 7
    Dernier message: 14/06/2007, 23h18
  3. [c#][.NET 2.0] Datagrid avec 2 combobox liées entre elles
    Par axl63800 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 20/04/2007, 09h31
  4. Réponses: 19
    Dernier message: 06/07/2006, 15h35
  5. Réponses: 6
    Dernier message: 19/05/2006, 14h22

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