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 :

Affichage des données d'une GridView en double


Sujet :

ASP.NET

  1. #1
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut Affichage des données d'une GridView en double
    Bonjour,

    Je développe actuellement un annuaire basé sur Active Directory.
    Cette annuaire sert à lister des informations sur les personnes présentes dans l'entreprise.
    Le résultat d'une recherche est présenté à l'aide d'une gridView.
    La gridView a pour source une DataView, qui a pour source une DataTable.

    L'affichage des données fonctionnait parfaitement jusqu'a ce que je définisse des colonnes à la gridView.
    J'ai du définir ces colonnes pour que l'utilisateur puisse effectuer un trie sur la colonne qu'il désire.

    Le problème c'est que depuis cette modification, lorsque la gridView s'affiche,
    les 9 colonnes ( nom, prénom, email, .... ) s'affiche en plusieurs exemplaires !!
    Et à chaque nouvelle recherche, le nombre de série de 9 colonnes de bases augmente de 2 !!
    1ere recherche : 2 fois 9 colonnes,
    2eme recherche : 4 fois 9 colonnes,
    3eme recherche : 6 fois 9 colonnes,
    etc ....

    J'ai beau cherché je ne vois pas où est mon erreur !!

    Quelqu'un saurait il me dire ce qui provoque ce comportement ??

    Merci d'avance pour votre aide.

    ElViRuS

  2. #2
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour,

    Tu le fais à quel moment l'ajout des colonnes (si dynamiquement) ? Car il ne faut pas le faire à chaque chargement de la page mais jouer avec le Page.IstPostBack.

    Si tu ne le fais pas dynamiquement mais dans le markup de ta page, pense à bien désactiver AutoGenerateColumns sur ta GridView (mais à ma connaissance ça ne devrait pas provoquer ce problème...)

    En espérant t'avoir aidé.

  3. #3
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Merci de ta réponse.

    J'ajoute les colonnes dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    protected override void CreateChildControls()
    {
    }
    J'ai bien mis le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     GridView1.AutoGenerateColumns = false;
    C'est quoi le "markup" de ma page ? (Désolé je ne travaille pas depuis longtemps sur cette techno )

    Merci d'avance.

  4. #4
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Le markup c'est le code ASP.NET/HTML, à différencier du code-behind qui correspond à ton code C# (ou vb). Donc pour résumer markup = page.aspx et code-behind : page.cs (ou page.vb).

    Ton problème est simple à chaque PostBack, tu rajoutes les colonnes. As-tu positionné un breakpoint dans ta méthode CreateChildControls pour voir combien de fois elle est appellé suite à un PostBack ?

    Sinon il nous faudrait ton code, ce serait plus simple.

    En espérant t'avoir aidé.

  5. #5
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Merci pour l'explication

    Le truc c'est que je n'ai pas de Page.aspx .
    En fait je développe une WebPart pour SharePoint donc j'ai deux fichier :
    - Page.ascx ,
    - Page.ascx.cs,

    Si j'ai bien compris ton explication, pour répondre à ta question, je construis
    les colonnes de ma GridView dans le code behind (Page.ascx.cs).

    Voila le code où je mets en place les colonnes :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
     
    protected override void CreateChildControls()
    {
                 GridView1.AutoGenerateColumns = false;
    	GridView1.DataSource = maDataView;
     
    	// Parametrage des options de pagination
                GridView1.AllowPaging = true;
                GridView1.PageSize = 10;
                GridView1.PagerSettings.Mode = PagerButtons.Numeric;
                GridView1.PageIndexChanging += new GridViewPageEventHandler(GridView1_PageIndexChanging);
     
    	// Parametrage des options de tri
    	GridView1.AllowSorting = true;
                GridView1.Sorting += new GridViewSortEventHandler(GridView1_Sorting);		
     
    	// On définit les colonnes de la gridView
     
    	// On commence par définir le menu sur la colonne "Nom" avec son menu
    	contactListMenu = new MenuTemplate();
    	contactListMenu.ID = "LeMenu";
    	// On définit le premier item de la liste
    	EntreeMenu = new MenuItemTemplate("Nouveau Message", "/_layouts/images/icmsg.gif");
    	EntreeMenu.ClientOnClickNavigateUrl = "mailto:%ColMail%";
    	contactListMenu.Controls.Add(EntreeMenu);
    	// On définit le deuxième item de la liste
    	EntreeMenu = new MenuItemTemplate("Fiche collaborateur", "/_layouts/images/perusr.gif");
    	EntreeMenu.ClientOnClickNavigateUrl = "http://www.google.fr";
    	contactListMenu.Controls.Add(EntreeMenu);
    	Controls.Add(contactListMenu);
     
    	// On définit la colonne "Nom"
    	Colonne1 = new SPMenuField();
    	Colonne1.HeaderText = "Nom";
    	Colonne1.TextFields = "Nom";
    	Colonne1.MenuTemplateId = "LeMenu";
    	Colonne1.NavigateUrlFields = "Nom,E-mail";
    	Colonne1.NavigateUrlFormat = "mailto:{1}";
    	Colonne1.TokenNameAndValueFields = "ColNom=Nom,ColMail=E-mail";
    	Colonne1.SortExpression = "Nom";
    	GridView1.Columns.Add(Colonne1);
     
    	// On définit la colonne "Prénom"
    	Colonne = new BoundField();
    	Colonne.DataField = "Prénom";
    	Colonne.HeaderText = "Prénom";
    	Colonne.SortExpression = "Prenom";
    	GridView1.Columns.Add(Colonne);
     
    	// On définit la colonne "Pôle"
    	Colonne = new BoundField();
                Colonne.DataField = "Pôle";
    	Colonne.HeaderText = "Pôle";
    	Colonne.SortExpression = "Pole";
    	GridView1.Columns.Add(Colonne);
     
    	// On définit la colonne "Entité"
    	Colonne = new BoundField();
    	Colonne.DataField = "Entité";
    	Colonne.HeaderText = "Entité";
    	Colonne.SortExpression = "Entite";
    	GridView1.Columns.Add(Colonne);
     
    	// On définit la colonne "Téléphone"
    	Colonne = new BoundField();
    	Colonne.DataField = "Téléphone";
    	Colonne.HeaderText = "Téléphone";
    	Colonne.SortExpression = "Telephone";
    	GridView1.Columns.Add(Colonne);
     
    	// On définit la colonne "Interne"
    	Colonne = new BoundField();
    	Colonne.DataField = "Interne";
    	Colonne.HeaderText = "Interne";
    	Colonne.SortExpression = "Interne";
    	GridView1.Columns.Add(Colonne);
     
    	// On définit la colonne "Mobile"
    	Colonne = new BoundField();
    	Colonne.DataField = "Mobile";
    	Colonne.HeaderText = "Mobile";
    	Colonne.SortExpression = "Mobile";
    	GridView1.Columns.Add(Colonne);
     
    	// On définit la colonne "E-mail"
    	Colonne = new BoundField();
    	Colonne.DataField = "E-mail";
    	Colonne.HeaderText = "E-mail";
    	Colonne.SortExpression = "E-mail";
    	GridView1.Columns.Add(Colonne);
     
    	// On définit la colonne "Site"
    	Colonne = new BoundField();
    	Colonne.DataField = "Site";
    	Colonne.HeaderText = "Site";
    	Colonne.SortExpression = "Site";
    	GridView1.Columns.Add(Colonne);
     
    	//GridView1.DataSource = maDataView;
    	//this.Controls.Add(GridView1);
    	//GridView1.PagerTemplate = null;
    	GridView1.DataBind();
     
            base.CreateChildControls();
        }
    Et ça c'est le code où je "mets" les données dans la gridView :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    protected void showresults(SearchResultCollection collection)
        {
     
    		try{
     
    			maDataTable = new System.Data.DataTable();
    			maDataTable.Columns.Add(new DataColumn("Nom", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("Prénom", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("Pôle", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("Entité", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("Téléphone", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("Interne", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("Mobile", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("E-mail", typeof(String)));
    			maDataTable.Columns.Add(new DataColumn("Site", typeof(String)));
     
     
    			foreach (SearchResult result in maCollection)
    			{
    				entry = result.GetDirectoryEntry();
    				DataRow newColDR;
    				newColDR = maDataTable.NewRow();
    				newColDR[0] = entry.Properties["SN"].Value;
    				newColDR[1] = entry.Properties["givenName"].Value;
    				newColDR[2] = entry.Properties["Company"].Value;
    				newColDR[3] = entry.Properties["Department"].Value;
    				newColDR[4] = entry.Properties["telephoneNumber"].Value;
    				newColDR[5] = entry.Properties["ipPhone"].Value;
    				newColDR[6] = entry.Properties["mobile"].Value;
    				newColDR[7] = entry.Properties["mail"].Value;
    				newColDR[8] = entry.Properties["l"].Value;
    				maDataTable.Rows.Add(newColDR);
    			}
     
    			Session["DataTableSession"] = maDataTable.Copy();
    			maDataView = new DataView();
    			maDataView = maDataTable.DefaultView;
    			// Par défaut on trie les résultats par Nom croissant
    			maDataView.Sort = "Nom" + " " + "asc";
     
    			// On "donne" à la GridView les données
    			GridView1.DataSource = maDataView;
    			GridView1.DataBind();
     
    			TXB_TXTRSRECH.Visible = true;
    			GridView1.Enabled = true;
    			GridView1.Visible = true;
    			IBT_XLS.Visible = true;
    			LBL_ICOXLS.Visible = true;
     
    			entry.Close();
    			maDataTable.Dispose();
    			maDataView.Dispose();
    			GridView1.Dispose();
     
    		}catch (Exception ex){
     
    			// Affichage de l'erreur
    			TXB_ERROR.Text += ex.Message;
    			TXB_ERROR.Visible = true;
    		}
     
        }
    Merci pour ton aide

  6. #6
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Je vois pas mal de chose pas très catholiques dans ton code

    Tu n'as semble-t-il pas compris le rôle de la méthode CreateChildControl, je t'invite à consulter la doc MSDN à ce sujet.

    Ensuite, pour un seul chargement de page, tu appelles deux fois la méthode DataBind de ta GridView, ce n'est pas bon. Également, pourquoi souhaites-tu gérér dynamiquement les colonnes de ta Grid alors que tu pourrais les mettre simplement dans le markup de ta page ?

    Également, tu parcours ta collection d'objet pour ensuite en faire une DataTable. Cette étape est inutile, tu pourrais binder directement ta collection dans la GridView.

  7. #7
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Merci pour tes réponses.

    Quelles sont les erreurs pas très catholiques ?

    Ensuite, pour un seul chargement de page, tu appelles deux fois la méthode DataBind de ta GridView, ce n'est pas bon.
    J'ai pris exemple sur un code existant De plus même en enlevant le DataBind()
    juste après avoir défini les colonnes ca ne change rien.

    Également, pourquoi souhaites-tu gérér dynamiquement les colonnes de ta Grid alors que tu pourrais les mettre simplement dans le markup de ta page ?
    J'ai voulu définir les colonnes pour que l'utilisateur puisse trier les résultats et pour pouvoir afficher un menu sur le champ de la première colonne.

    Également, tu parcours ta collection d'objet pour ensuite en faire une DataTable. Cette étape est inutile, tu pourrais binder directement ta collection dans la GridView.
    Avec la DataTable je peux définir des colonnes, c'est plus clair que dans la collection.

    Merci d'avance et désolé d'être mauvais

  8. #8
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Citation Envoyé par clem5-9 Voir le message
    J'ai pris exemple sur un code existant De plus même en enlevant le DataBind() juste après avoir défini les colonnes ca ne change rien.
    Tous les bouts de code sur le net ne sont pas bons à prendre


    Citation Envoyé par clem5-9 Voir le message
    J'ai voulu définir les colonnes pour que l'utilisateur puisse trier les résultats et pour pouvoir afficher un menu sur le champ de la première colonne.
    Le fait de définir tes colonnes dans le markup n'empêche en rien le fait de pouvoir trier tes résultats. Concernant le menu, tu peux le rajouter au moment du Bind de la Grid (il existe de nombreux exemples sur le net sur comment ajouter dynamiquement des contrôles dans une GridView, ou comment utiliser l'event OnRowDataBound).


    Citation Envoyé par clem5-9 Voir le message
    Avec la DataTable je peux définir des colonnes, c'est plus clair que dans la collection.
    Question de point de vue. Tu fais comme tu le sens, c'est ton code après tout
    Il n'empêche qu'en créant ta table (pour rien si j'ose dire...), tu réalises une allocation mémoire et doit parcourir toute ta collection. Niveau perf ça ne le fait pas trop. De même, stocker ta table en Session uniquement pour pouvoir la récupérer dans le CreateChildControls, c'est pas top non plus.

    Un autre truc que je qualifiais de pas très catholique => les appels à la méthode Dispose. Il te faudrait lire un peu de doc sur le fonctionnement du Garbage Collector.

  9. #9
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Tous les bouts de code sur le net ne sont pas bons à prendre
    Ca vient pas du net, ça vient du code qui est en place où je bosse

    Le fait de définir tes colonnes dans le markup n'empêche en rien le fait de pouvoir trier tes résultats. Concernant le menu, tu peux le rajouter au moment du Bind de la Grid (il existe de nombreux exemples sur le net sur comment ajouter dynamiquement des contrôles dans une GridView, ou comment utiliser l'event OnRowDataBound).
    Tu pourrais m'en dire plus sur ce point ou me donner un lien qui explique ça

    Il n'empêche qu'en créant ta table (pour rien si j'ose dire...), tu réalises une allocation mémoire et doit parcourir toute ta collection. Niveau perf ça ne le fait pas trop.
    J'avoue Je suis novice c'est pour ça que je fais pas trop attention à ça

    De même, stocker ta table en Session uniquement pour pouvoir la récupérer dans le CreateChildControls, c'est pas top non plus.
    Je la stocke dans la session car grâce à un bouton, une fonction que j'ai crée construit un csv avec cette dataTable,
    mais après un page_Load elle est vidée ! Donc pour la conserver je l'a mets dans un attribut de session

    les appels à la méthode Dispose
    C'est une personne où je fais mon stage qui m'a dit de mettre ça
    Je vais y jeter un coup d'oeil

    Merci encore pour tes réponses

  10. #10
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Bon j'ai éssayé de faire comme tu m'avais suggéré : déclarer les
    colonnes dans le markup.

    Ca fonctionne presque bien
    Pour toutes recherches que j'effectue, la gridView m'affiche 2 fois
    les mêmes colonnes !
    Est-ce que ca vient du fait que j'ai déclaré des colonnes dans ma DataTable ?

    Merki d'avance

    Edit ==>
    Problème résolu
    J'ai mis "AutoGenerateColumns=false" et c'est bon !
    Par contre, malgré "AllowSorting=true", je ne peux pas faire de tri !
    Quand je me place sur la colonne, il ne me fait pas comme si c'était un lien

    Edit d'Edit ( promis la prochaine fois je réfléchi un petit peu plus avant de poster ) :
    J'ai rajouté "SortExpression=xxxx" sur chaque colonne et ça fonctionne

  11. #11
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Bon pour le fait que les colonnes se répétent c'est ok le problème est réglé.
    Mais par contre le problème que je rencontre actuellement c'est pour remettre un menu sur chaque champ de la première colonne !
    J'ai regardé et compris le principe de l'event "OnRowDataBound" mais je ne sais pas comment l'utiliser et comment lier mon SPMenuField à cette colonne ??

    Merci d'avance.

  12. #12
    Membre Expert
    Avatar de Nicolas Esprit
    Homme Profil pro
    Consultant en technologies
    Inscrit en
    Février 2010
    Messages
    1 467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en technologies
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 1 467
    Par défaut
    Bonjour,

    Bon pour le fait que les colonnes se répétent c'est ok le problème est réglé.
    Tant mieux . C'est justement en résolvant les erreurs par soi même qu'on apprend le plus.

    'ai regardé et compris le principe de l'event "OnRowDataBound" mais je ne sais pas comment l'utiliser et comment lier mon SPMenuField à cette colonne ??
    En fait je n'avais pas fait attention : ton SPMenuField est un comme un BoundField, ce n'est pas un contrôle comme un Label ou une TextBox. Tu devrais pouvoir le déclarer tel que les autres BoundFields dans le markup de ta page.

    Tu y es presque :-)

  13. #13
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Tant mieux . C'est justement en résolvant les erreurs par soi même qu'on apprend le plus.
    Je suis tout à fait d'accord avec toi mais c'est juste que au bout d'un moment
    y'a de quoi peter un cable

    ton SPMenuField est un comme un BoundField
    Nan justement je ne pense pas car quand je vais dans VWD dans ma gridView (dans le markup) l'autocomplémentation ne me donne que 5 ou 6 possibilités ... et pas de SPMenuField ...
    Le truc c'est qu'il me semble que les SPMenuField sont des objets SharePoint !? (SharePointMenuField)
    Je me trompe ??

    ENcore un problème

  14. #14
    Membre averti
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    33
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 33
    Par défaut
    Bon pas de réponses
    J'ai trouvé une solution, certes pas très "jolie", mais qui me permet de ne pas
    rester bloqué sur ce problème !

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

Discussions similaires

  1. [Tableaux] affichage des données d'une base
    Par Nickwell dans le forum Langage
    Réponses: 1
    Dernier message: 29/09/2006, 17h14
  2. limite de l'affichage des donnés dans une Bdgrid
    Par helmis dans le forum Bases de données
    Réponses: 3
    Dernier message: 19/07/2006, 09h15
  3. Affichage des données d'une bdd dans un formulaire
    Par Shekhmet dans le forum Langage
    Réponses: 5
    Dernier message: 04/04/2006, 19h27
  4. [MySQL] Affichage des données d'une base
    Par leloup84 dans le forum PHP & Base de données
    Réponses: 30
    Dernier message: 01/02/2006, 16h35

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