none
Problème de requête CAML RRS feed

  • Question

  • Bonjour, j'ai réalisé un code qui permet de sélectionner des lignes d'une liste mais la méthode GetDataTable ne renvoi rien : En déboguant, je vois que 
    objSPListItemCollection  contient des éléments mais la méthode ne renvoi rien ?!!!

    public DataTable GetData(string nomListe)
            {
                DataTable datatable = new DataTable();
                SPList objSPList=SPContext.Current.Web.Lists[nomListe];
                SPListItemCollection objSPListItemCollection;
                string str = null;
                try
                {
                    #region Requête CAML sur la liste sélectionné dans la zone de config
                    SPQuery objSPQuery = new SPQuery();
                    for (int i = 0; i < DisplayFields.Count; i++)
                    {
                        str += @"<FieldRef Name='" + DisplayFields[i] + "' />";
                    }
                    objSPQuery.ViewFields = str;
                    objSPListItemCollection = objSPList.GetItems(objSPQuery);
                    #endregion
    
    
                    #region Affecter la valeur de la requête au grid
                    datatable=objSPListItemCollection.GetDataTable();
                    datatable.AcceptChanges();
                    #endregion
    
    
                }
    
                catch (Exception E)
                {
                    //LblErreur.Text = E.Message;
                }
    
                return datatable;
            }
    
     
    mardi 7 juillet 2009 10:56

Réponses

Toutes les réponses

  • Bonjour,

    Le fait que votre DataTable soit vide est surement du à une levée d'erreur avant l'affectation de la variable datatable, indétectable avec un bloc catch vide. Vous pouvez retirer le bloc try/catch et/ou passer en debug dans votre code pour voir ce qui lève cette erreur.

    Remarque : datatable.AcceptChanges() est inutile dans un contexte SharePoint.
    http://blogs.developpeur.org/anouvel
    mardi 7 juillet 2009 11:50
  • J'ai enlevé le block try catch mais il n'y a pas de problème.
    mardi 7 juillet 2009 12:18
  • Avant ma première réponse, j'ai testé votre code dans une CodeTesterWebPart (en mettant un nom de liste et des éléments FieldRef en dur) et j'ai bien obtenu un DataTable contenant des données.

    Pourriez-vous détailler le problème svp ?
    le datatable est null ? le datatable ne contient aucune ligne ? aucune colonne ?
    http://blogs.developpeur.org/anouvel
    mardi 7 juillet 2009 12:25
  • Oui le datatable ne contient aucune ligne, j'ai testé
    objSPListItemCollection et je trouve qu'il y a des lignes (count !=0) mais quand j'appelle getDataTable() la datatable ne contient rien.

    En fait puisque je construit ma requête dynamiquement, est ce que les colonnes des listes à afficher sont des DisplayText ou InternalText

    parce que dans mon DisplayFields je stocke le nom (Title) des fields à afficher
    mardi 7 juillet 2009 12:29
  • Je crois que j'ai un problème quand je fais le bind de mon SPGridView, en fait j'ai pu testé la valeur de mon datatable et c'est bon

    Cette méthode permet de créer les champs du grid
    public void BindingColumns()
            {
                try
                {
                    for (int i = 0; i < GetData(NomListe).Columns.Count; i++)
                    {
                        BoundField colTitle = new BoundField();
    
                        colTitle.DataField = GetData(NomListe).Columns[i].ColumnName;
    
                        colTitle.HeaderText = GetData(NomListe).Columns[i].ColumnName;
                        this.objSPGridView.Columns.Add(colTitle);
                    }
    
                    
                   
                  
                }
    
                catch (Exception E)
                {
                    this.Page.Response.Write("<script>alert('" + E.Message + "')</script>");
                }
            }
     protected override void CreateChildControls()
            {
                try
                {
                    base.CreateChildControls();
    
                    objSPGridView = new SPGridView();
                    objSPGridView.AutoGenerateColumns = false;
    
                    BindingColumns();
    
                    this.Controls.Add(objSPGridView);
                    // Paging
                    objSPGridView.AllowPaging = true;
                    //this.Page.Response.Write("<script>alert('" + NombrePage + "')</script>");
                    objSPGridView.PageSize = Convert.ToInt16(NombrePage);
    
                    // Sorting
                    objSPGridView.AllowSorting = true;
    
                    TextBoxnomliste = new TextBox();
                    TextBoxcheckbox = new TextBox();
                    TextBoxnbpage = new TextBox();
                   
                    this.Controls.Add(TextBoxnomliste);
                    this.Controls.Add(TextBoxcheckbox);
                    this.Controls.Add(TextBoxnbpage);
                    //SPGridViewPager pager = new SPGridViewPager();
                    //pager.GridViewId = objSPGridView.ID;
    
                    //this.Controls.Add(pager);
                }
                catch (Exception E)
                {
                    this.Page.Response.Write("<script>alert('"+E.Message+"')</script>");
                }
    
                
            }
    

    mardi 7 juillet 2009 13:03
  • Il manque le binding de la grille à la source de données.
    Après avoir initialisé votre grille (par exemple après le AllowSorting = true), vous pourriez mettre le code suivant :

    DataTable dt = GetData(NomListe);
    objSPGridView.DataSource = dt;
    objSPGridView.DataBind();
    


    Vous faites beaucoup d'appels à GetData(), notamment dans votre boucle for, ce serait bien de ne le faire qu'une fois pour des raisons de performance.


    http://blogs.developpeur.org/anouvel
    mardi 7 juillet 2009 14:07
  • J'ai mis ces méthodes de la méthode Render, mais bon j'ai comme même ajouté ce bout de code ou vous m'avez demandé, mais il affiche des colonnes que je n'ai pas coché c'est à dire elle n'existe pas dans DisplayFields c'est comme si il fait pas bien le mapping. En fait je récupère bien ce que je coche dans le toolpart et je passe ça à la requête qui se construit dynamiquement, mais après exécution de la requête et plus précisement après GetDataTable() elle renvoit des noms de colonnes que je n'ai pas coché !!!
    mardi 7 juillet 2009 14:24
  • Bonjour, je rencontre un vrai problème : quand je récupère tous les fields avec un objet List je trouve qu'ils sont différentes quand j'exécute une requête CAML sur ma liste et en renvoyant un DataTable. Comment fait le mappinge des colonnes la méthode GetDataTable() ?
    mercredi 8 juillet 2009 09:17
  • Bonjour,

    la méthode GetDataTable() renvoie un datatable contenant toutes les colonnes retournées par votre requête CAML (+ ID et date de creation).
    Si GetDataTable() ne renvoie pas les colonnes attendues, alors le problème se situe dans la requête CAML.

    Est-ce que cela répond à votre question ?
    http://blogs.developpeur.org/anouvel
    • Proposé comme réponse Arnault Nouvel mercredi 8 juillet 2009 12:26
    mercredi 8 juillet 2009 12:26
  • Bonjour, je viens de trouver la source du problème : la requête CAML est bien faite sauf que GetDataTable ne renvoit pas toutes les colonnes SharePoint car il y a des champs cachés voilà une explication détaillé : http://www.myrocode.com/post/2009/05/20/Improving-SharePoints-SPListItemCollection-GetDataTable()-lets-get-all-the-fields-I-need.aspx
    • Marqué comme réponse ZEMZEMI Amine mercredi 15 juillet 2009 08:09
    mercredi 8 juillet 2009 12:30
  • En effet c'est la propriété ViewFields de l'objet SPQuery qui détermine quelles colonnes seront retournées dans l'objet SPListItemCollection par list.GetItems(query), je me suis mal exprimé :)
    http://blogs.developpeur.org/anouvel
    • Marqué comme réponse ZEMZEMI Amine mercredi 15 juillet 2009 08:09
    mercredi 8 juillet 2009 12:38