Correspondance entre datakey et index ds un Gridview [Résolu]

Signaler
Messages postés
23
Date d'inscription
mardi 11 juillet 2006
Statut
Membre
Dernière intervention
27 octobre 2008
-
Messages postés
14
Date d'inscription
dimanche 10 septembre 2006
Statut
Membre
Dernière intervention
25 mars 2008
-
Bonsoir,

Je tente de mettre en place un moteur de recherche sur mon application de suivi des marchés :
Un champs texte en haut à droite, qui liste ds une 2nd page les marchés et les
projets en rapport avec le mot recherché.
Cette page de résultat doit rediriger vers le listing des marchés
(marchés.aspx), s'il s'agit d'un marché, ou le listing des
projets(affaires.aspx) s'il s'agit d'un projet.
Donc je fais un lien avec en paramètre l'ID du marché recherché et trouvé. Ex :
marchés.aspx?id=789
Du coup ds la page marchés.aspx, j'ai le code suivant ds le load de la page :
int id_marche = Int32.Parse(Request.Querystring["id"]

Jusqu'ici pas de problème.

Mais comment faire pour sélectionner la ligne correspondante ds mon listiing (Gridview) des
marchés ?
Il y a bien une propriété Gridview.SelectedDatakey, mais c'est en lecture seule.
Sinon, il y a Gridview.SelectedIndex, qui est en lecture et en écriture, mais
comment alors obtenir la correspondance entre la clef primaire d'une ligne et
l'index de cette ligne ???

Je suis obligé pour l'instant, de faire une boucle, de parcourir le gridview et
si le champs de la colonne ID = l'id marché récupéré du querystring
Mais ça n'est pas non plus satisfaisant, car si la ligne du marché se trouve ds
la 2nd page de mon gridview, il ne la trouve pas...

Voici le code
------------
  if (Request.QueryString["id"] != null)
        {
            int id_marché = Int32.Parse(Request.QueryString["id"]);

            #region "Correspondance id / index"

            int index_marché = 0;

            while (gvMec.PageIndex < gvMec.PageCount)
            {
                foreach (GridViewRow gvrow in gvMec.Rows)
                {
                    if (gvrow.Cells[0].Text == id_marché.ToString())
                    {
                        index_marché = gvrow.DataItemIndex;
                        break;
                    }
                }
                gvMec.PageIndex++;
            }

                gvMec.SelectedIndex = index_marché;
              #endregion

       }

Herwin

6 réponses

Messages postés
14
Date d'inscription
dimanche 10 septembre 2006
Statut
Membre
Dernière intervention
25 mars 2008

un exemple rapide que tu peux tester chez toi :) :

 protected void Page_Load(object sender, EventArgs e)
    {
        GridView1.DataBound += new EventHandler(GridView1_DataBound) ;
        List<string> oList = new List<string>();
        oList.Add("toto");
        oList.Add("tata");
        oList.Add("titi");
        GridView1.DataSource = oList;
        GridView1.DataBind();
}

void GridView1_DataBound(object sender, EventArgs e)
{
        List<string> oList = ((GridView)sender).DataSource as List<string>;
        for (int i = 0; i < oList.Count; i ++)
        {
            //fair qqch
            if (oList[i] == "titi")
            {
                GridView1.SelectedIndex = i;
                break;
            }
       }
}

facile a transposer sur ton cas...
Messages postés
14
Date d'inscription
dimanche 10 septembre 2006
Statut
Membre
Dernière intervention
25 mars 2008

Salut,
tu peux le faire au binding de la gridview,
en parcourant les items et vérifiant qu'ils correspodent ou pas a tes données,
tu lance un select() quand tu as trouvé le bon...
Messages postés
23
Date d'inscription
mardi 11 juillet 2006
Statut
Membre
Dernière intervention
27 octobre 2008

Merci pour cette piste,
Mais qu'entends-tu par "le faire au binding de la gridview".
Ca m'interesse beaucoup, mais je ne vois paq trop le code que cela donnerait.

Peux-tu m'en donner une idée

Merci d'avance,
Herwin
Messages postés
14
Date d'inscription
dimanche 10 septembre 2006
Statut
Membre
Dernière intervention
25 mars 2008

pardon, je me suis un peu enflammé, j avais mal lu,
je crois que de plus les gridview sur plusieurs page l index ne reprend pas a 0,
donc nbpage * taille page + index...

enfin le databindind est toujours bon a prendre :)
Messages postés
1
Date d'inscription
mardi 9 septembre 2003
Statut
Membre
Dernière intervention
19 février 2008

salut poulouf,
j'ai repris ton code ci-dessus pour la correspondance id et index
#region "Correspondance id / index"

int idx = -1;

while (
this.GridView1.PageIndex < 
this.GridView1.PageCount)
{
   
foreach (
GridViewRow gvrow 
in
this.GridView1.Rows)
   {
      
if (gvrow.Cells[0].Text == result.ToString())
      {
         idx = gvrow.DataItemIndex;
         
break;
      }
   }
   GridView1.PageIndex++;
}
GridView1.SelectedIndex = idx;
#endregion



et tu dis t'être un peu enflammé... nbpage * taille page + index...
peux-tu complèter le bout de code avec ta solution (nbpage * taille page + index...)?

merci d'avance
TOzZ
Messages postés
14
Date d'inscription
dimanche 10 septembre 2006
Statut
Membre
Dernière intervention
25 mars 2008

Salut,
c'était juste pour positionner la gridview
sur la bonne page (en fonction du nombre de données et tout ca...)
tu dois avoir bonnepage = index/taillepage avec le select dans le databind,

perso je suis pas fan du paging sur les gridview, même si ça a son avantage
dans le cas de tri alphabétique et quand il y a beaucoup de données...

Bon courage et désolé pour le temps de réponse...