Problème datagrid

Signaler
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007
-
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007
-
Bon, je sais je suis chiant mais je suis sur que je ne suis pas le seul.  (lol)  :-)


J'explique mon nouveau problème et là je suis sur que cela porte sur du code.

Voila dans une première page j'ai une ListBox dans laquelle se trouve
plusieurs personnes. Cette ListBox à la propriété multiple donc
l'utilisateur peut choisir plusieurs personnes.


Donc l'utilisateur choisit des personnes et clique sur un bouton qui va
l'envoyer sur une autre page et qui va mettre dans un ArrayListe de
type static (déjà la je suis par sur que sa soit bien) toutes les
personnes sélectionnés.


Lors du chargement de la seconde page, je dois remplir un datagrid avec
toutes les personnes choisies et d'autres informations les concernant
donc je fais une boucle Pour pour savoir combien de personnes ont été
selectionné puis dans cette boucle je fais ma connexion avec la base de
données pour chaques personnes puis je remplis par DataGrid mais
celle-ci ne m'affiche que la dernière personne.


Un exemple vaut mieux qu'un grand discours voici une partie de mon code :


if(!IsPostBack) {

    for (i=0;i<=WebApplication1.WebForm3.myListBoxSelectVal.Count;i++) {


        //S'il y a une erreur lors de la connexion ou de l'identification, je renvoie false

        try {

            maConnexion = new OleDbConnection (

           
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""E:\Temp\JF\Maquette
asp\Personne.mdb""");

            

            maConnexion.Open();


            string
querytest "SELECT CodePerso, Nom, Prenom From Commercial where Nom
'" +                  
                   
                 
WebApplication1.WebForm3.myListBoxSelectVal[i] +"'";
           

            OleDbDataAdapter monAdapter = new OleDbDataAdapter (querytest,
maConnexion);

                   
            DataSet
monDataSet = new DataSet ();

            monAdapter.Fill(monDataSet);

            DataGridCom.DataSource = monDataSet;

            monDataSet.Dispose();
       

        }catch (Exception) {
             Response.Write("Erreur");
        } finally  {
             if
(maConnexion != null)
                maConnexion.Close();
             }
          }
     }

}


Encore désolé de vous sollicité.

25 réponses

Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Bonsoir,

c'est normal ce qui t'arrive ! Tu binds tes controles plusieurs fois de suite et logiquement c'est la derniere valeur qui est affiché ... :-/

et non ce n'est pas bien de mettre des données propres à un user dans une variable static qui est propre à l'application donc plusieurs users partagent la meme valeure :s les variables sessions sont tes amis :)

<hr />Cyril - MVS - MCP
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Comment résoudre mon premier problème alors pour ne pas binder à chaque fois car je suis obligé de faire une requête pour chaques personnes selectionné par l'utilisateur.
En ce qui concerne la variable static, je vais créer une variable de sessions qui vaa donc contenir toutes les personnes selectionnées.
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Tu fais une requete qui te retournent toutes les lignes plutot que pleins de petites requetes ..

<hr />Cyril - MVS - MCP
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Faut que je fasse des inner join et découper ma variable de session en plusieurs petit bout alors du style :

ArrayList perso = new ArrayList();
int i=0; 

Tant que j'ai pas récupérer toutes mes personnes selectionnées dans ma variable de session faire
   perso[i] = session[i];
   i++;
Fin tant

Select * from Personne where nom = ' " + perso[i] + "'"
Union
Select * from Personne where nom = ' " + perso[i++] +" ' "

Mais comment je sais le nombre d'union que je dois faire tout dépend du nombre de personne selectionnée.
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
salut,


je te suggère de mettre l'id des personnes dans ta liste (vluae=id, text = nom + prénom).
ensuite, sur ta page qui affiche tes personnes sélectionnées, tu récupères les ids et tu crées une requête du genre:

select * from personne where id in (" + idReceived "+) Order by nom ASC"

yopyop
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
vluae = value

yopyop
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Ok je vais tester ça, je te remercie pour cette réponse qui m'a éclairé.
Je te tiens au courant de l'avancement de mon problème
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Ok, j'ai voulu essayé mais je sais pas comment on fait pour mettre l'id
des personnes dans ta liste (value=id, text = nom + prénom) dans le
code behind

Car pour remplir ma liste je fais

foreach (DataRow dr in monDataSet.Tables[0].Rows)

    {

        LBCom.Items.Add(dr["Nom"].ToString());

    }


Et je ne suis pas sûr que idReceived marche puisque sa va être un
ArrayList, la requête ne va pas lire toutes les cases de mon ArrayList
et voir si cela correspond au id de la personne.
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
re,


pourquoi ne pas utiliser le databinding pour ta liste (ps, le code est en vb.net) ?

LBCom.DataSource = monDataSet
LBCom.DataValueField = "ID"
LBCom.DataTextField = "Name"
LBCom.DataBind()

Ensuite tu peux récupérer les ids sélectionnées et les utiliser pour ta requête.
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Ok, j'ai remplacé mon code

foreach (DataRow dr in monDataSet.Tables[0].Rows)

            {

                LBCom.Items.Add(dr["Nom"].ToString());

            }


par

LBCom.DataValueField = "CodePerso";

LBCom.DataTextField = "Nom";

LBCom.DataBind();


Mais dans le code de l'autre page ou j'envoi l'utilisateur, je récupère
mes commerciaux selectionnés grâce à la variable de session
préalablement remplit


ArrayList ComSel = (ArrayList)Session["ComSel"];


Mais je peux pas faire ma requête comme sa

string querytest = "SELECT CodePerso, Nom, Prenom From Commercial where CodePerso in ('" + ComSel +"')";

Car sinon il ne voit pas les valeurs de mon ArrayList mais plutot sa : "System.Collections.ArrayList".


Et c'est la le problème, il faut que je lui indique dans quel case il
doit aller et pour cela j'utilise une boucle for ce qui efface donc les
valeurs à l'intérieur de mon DataGrid et donc à l'affichage il me reste
plus que la dernière personne selectionné par l'utilisateur.
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
re,

qu'est ce que tu mets exactement dans ta variable session ComSel?
normalement tu devrais y mettre une liste d'id (la liste des codeperso selectionnés).

ensuite tu fais un truc du genre (ps, il vaut mieux utiliser un stringbuilder):

Dim sListIds as string=""

'contruire une string de la fome 12,15,554,67 = listes des ids selectionnées, séparées par une virgule
for each id as string in ComSel
 slistids=slistids & id & ","
next

string querytest = "SELECT CodePerso, Nom, Prenom From Commercial where CodePerso in (" + slistids +")

yopyop
Messages postés
6814
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
28
Si c'est un tableau de string on peut aussi le mettre dans la variable session puis faire un join(",") dessus ca évite en plus de devoir supprimer la derniere virgule de la concaténation ;-)

<hr />Cyril - MVS - MCP
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Dans ma variable session, je mets mon ArrayList (c'est peu être pas une
bonne solution, je sais pas). A la limite je peux changer mon ArrayList
pour un tableau de int ou de string car au final sa sera des int
puisque c'est des identifiants. Et puis il n'y a aucune utilité d'avoir
un ArrayList ici :-)

Après reste à savoir si je peux utiliser un join sur le tableau de int.


En tout cas, merci pour vos réponses


Juste une autre petite question comme savoir si ma requête ne renvoie
rien. Cela est-il possible de le savoir avant de remplir mon dataset ?

Est-il possible de faire une requete de type select sur un dataset car
cela m'éviterait de faire à chaque fois une connexion à la base de
données car cette appel se trouve dans deux boucles pour imbriquée et
je trouve que le temps pour exécuter mon code est largement trop long.
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
re,


pour les select sur un dataset, regarde la méthode Filter ou Select (si je me souviens bien, ces méthodes te renvoient un tableau de datarows, tu peux les utiliser pour re-remplir un dataset et le binder à tes contrôles...reste à savoir si cela est vraiment plus rapide que de refaire une requête...).

a+
yopyop
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Ok merci, je vais regarder sa.


Sinon j'ai tester ta solution

string ConcatComSel = "" ;


for (i=0;i<ComSel.Count;i++)  {

    ConcatComSel = ConcatComSel + ComSel[i].ToString() + ",";

}


maConnexion = new OleDbConnection (@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""E:\Temp\JF\Maquette asp\Personne.mdb""");


 maConnexion.Open();


string querytest = "SELECT CodePerso, Nom, Prenom From Commercial where CodePerso in ('" + ConcatComSel +"')";


Mais sa ne marche pas,il ne me renvoie rien


J'ai tester directement dans la base Access pour voir si cela fonctionne. Mais sa marche pas non plus.

Alors là, je ne vois plus comment faire
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Youpi sa marche

A enfin, je commencer en avoir marre.

En fait, mes identifiants sont des strings (fallait le savoir lol)


Voici donc le bout de code que j'ai fais (il y a peu être plus simple mais au moins sa marche)

for (i=0;i<ComSel.Count;i++) {

    if (ConcatComSel == "") {

        ConcatComSel = "'" +
ComSel[i].ToString() + "'";       
   

    }

    else

    {

        ConcatComSel = ConcatComSel + "," + "'" + ComSel[i].ToString() + "'";

    }

}


string querytest = "SELECT CodePerso, Nom, Prenom From Commercial where CodePerso in (" + ConcatComSel + ")";


Et bien en trois jours, j'ai réussit à résoudre ce problème, j'ai failli craquer, je l'avoue.


Sinon au sujet du renvoie d'une requête vide comme demandé ci dessus, une solution ???

                   
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
pour la requête vide
tu peux faire monDataSet.Tables[0].Rows.count

si count=0 bein c'est vide

yopyop
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

Donc je suis obligé de faire remplir mon dataset.

Parce que je sais pas pourquoi mais ma page met 30 seconde avant de s'afficher et je trouve ce délai carrément trop élevé.

En fait, sur ce  bout de code je crée un tableau html
dynamiquement pour cela j'utilise deux boucles for, une pour les lignes
et une pour les colonnes.

Lors de ces boucles for imbriquée je fais ma requête et je crois que
c'est là le problème c'est que sa fait au moinsdeux cents appel à la
base de données.

Mais dès fois la requête ne renvoie rien c'est pour sa j'aurais voulu réduire le temps de chargement.


Voici un bout de mon code :

for (ligne = 0;ligne<=7;ligne++) {

    HtmlTableRow Maligne = new HtmlTableRow();

    for (colonne = 0;colonne<=34;colonne++) {

        HtmlTableCell MaCase = new HtmlTableCell();

       try {

           maConnexion = new
OleDbConnection (@"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=""E:\Temp\JF\Maquette        
    asp\RDV.mdb""");

           maConnexion.Open();


          string querytest = "SELECT
H_deb_RDV,H_fin_RDV,CodePerso FROM Planning where Date_RDV = " +
                   
    dt.AddDays(diff).ToString("yyyy") + dt.AddDays(diff).ToString("MM") +
dt.AddDays(diff).ToString("dd") + "";
       

        OleDbDataAdapter monAdapter = new
OleDbDataAdapter (querytest, maConnexion);

           
           
   

       DataSet ds = new DataSet ();

       monAdapter.Fill(ds);


       if (ds.Tables[0].Rows.count == 0) {

          //Je ne fais aucun traitement

        } else {

          //Faire le traitement

       }

    }

}


En tout cas, MERCI de ton aide Yopyop
Messages postés
586
Date d'inscription
lundi 7 janvier 2002
Statut
Membre
Dernière intervention
10 février 2010
1
re,


je pense que tu peux optimiser ton code....


les lignes sont les jours (je pense)
les colones sont ???

Bref, peut-être que tu t'y prends mal pour faire ce que tu fais...
quel est le but de ton code?

yopyop
Messages postés
62
Date d'inscription
mercredi 21 juin 2006
Statut
Membre
Dernière intervention
24 mars 2007

En fait, les lignes sont les jours comme tu le dis et les colonnes sont les intervalles horaires.


Le but de ce bout de code est de faire un petit planning de
visualisation multipersonne. En fait, chaque personne se vera attribuer
une couleur que j'afficherais si la personne à un rendez-vous sur la
plage horaire ou je me trouve.


C'est pour sa que je suis obligé de faire mes requêtes dans deux boucles pour imbriquées.