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 :

[ASP][NET1.1]Probleme avec la fonction DataBinder.Eval()


Sujet :

ASP.NET

  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 19
    Points
    19
    Par défaut [ASP][NET1.1]Probleme avec la fonction DataBinder.Eval()
    Slt,

    J'ai un probleme avec la fonction DataBinder.Eval() dans ma page asp.

    Dans mon code behdin, je crée et remplie une dataTable comme ceci:

    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
     
    DataTable myDt = new DataTable("Infos");
     
     
    myDt.Columns.Add(new DataColumn("FileName", typeof(String)));
    myDt.Columns.Add(new DataColumn("Date", typeof(DateTime)));
    myDt.Columns.Add(new DataColumn("Area", typeof(String)));
    myDt.Columns.Add(new DataColumn("NumberOfProjects", typeof(Int32)));
    myDt.Columns.Add(new DataColumn("NumberOfDocuments", typeof(Int32)));
    myDt.Columns.Add(new DataColumn("TypeOfPCR", typeof(String)));
     
    DataRow row = myDt.NewRow();
     
    // Fill each column
    row["FileName"] = "Test_nom_de_fichier";
    row["Date"] = DateTime.Now;
    row["NumberOfProjects"] = "8";
    row["NumberOfDocuments"] = "10";
    row["Area"] = "Collaboration";
    row["TypeofPCR"] = PCR_TYPE;
     
    // Add the row to the DataTable
    myDt.Rows.Add(row);
     
    DataView myDv = new DataView(myDt);
     
    MyDataGrid.DataSource = myDv;
    MyDataGrid.DataBind();
    Maintenant dans mon fichier ASP, en plus des 6 colonnes de ma DataTable, je lui ajoute une colonne avec une textBox par ligne. Pour chacune de ces textBox, je souhaiterais leur affecter comme ID la valeur de row["FileName"] = "Test_nom_de_fichier";, cest a dire "Test_nom_de_fichier".

    Pour cela j'ai testé ceci:

    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
     
    <asp:DataGrid 
    	id="MyDataGrid"
    	runat="server" 
    	AutoGenerateColumns="False"
    >
     
    <Columns>
    	<asp:TemplateColumn>
                     <ItemTemplate>	
    			<asp:CheckBox 
                                   id='DeleteThisReport_<%# DataBinder.Eval(Container.DataItem, "FileName")%>' 
    			       runat="server" 
    			/>
    		</ItemTemplate>
    	</asp:TemplateColumn>
    	<asp:HyperLinkColumn 
    		HeaderText="See detail"
                    DataNavigateUrlField="FileName" 
    		Text="Detail"
                    DataNavigateUrlFormatString="~/PCRDetailsPage.aspx?filename={0}"
    		Target="_new"
    	/>
    	<asp:BoundColumn 
    		DataField="Date" 
    		HeaderText="Date" 
    	/>
    	<asp:BoundColumn 
    		DataField="Area" 
    		HeaderText="Area" 
    	/>
    	<asp:BoundColumn 
    		DataField="NumberOfProjects" 
    		HeaderText="Nb of project" 
    	/>
    	<asp:BoundColumn 
    		DataField="NumberOfDocuments" 
    		HeaderText="Nb of file" 
    	/>
    	<asp:BoundColumn 
    		DataField="TypeOfPCR" 
    		HeaderText="Type"
    	/>
    	</Columns>
    </asp:DataGrid>
    A l'execution jai cette erreur:

    'DeleteThisReport_<%# DataBinder.Eval(Container.DataItem, "FileName")%>' is not a valid identifier
    Pourquoi cette erreur? j'ai pourtant bien ma colonne qui sàppelle "Filename" dans ma dataTable.

    Merci d'avance.
    ++

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2004
    Messages
    417
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2004
    Messages : 417
    Points : 581
    Points
    581
    Par défaut
    j'ai eu le meme probleme apres quelques temps de prise de tete j'en ai eu marre et je l'ai fais dans le DataBound.
    Si qqn a une solution je suis preneur

  3. #3
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Mélanger du code-behind et du déclaratif c'est pas la fête pour maintenir ton code. Tu devrais choisir l'un des deux, ça serait moins crade.

    Ensuite pourquoi affecter une ID à tes TextBox ?
    Si c'est juste pour pouvoir faire un FindControl derrière, c'est carrément barbare comme solution.
    Je te suggère plutôt de générer ta colonne de Textbox en code-behind, comme les autres colonnes.
    En fait, je comprend même pas pourquoi une solution aussi tordue t'es venue à l'esprit... tu veux faire quoi en fait, au final ?

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Slt Mose,

    En fait j'ai fait une ptite erreur dans mon message. Ce n'est pas des textBox mais des Checkbox (oui, jaurais du me relire!!). Je veux affecter un ID unique a chacune de ces checkbox (ID qui correspondondrait a un nom de fichier et dont ce nom correspond à la valeur du champ d'une colonne de ma DataGrid).
    Au final, le but est qu'avec un bouton je supprime les fichiers dont les checkbox associés ont été cochées.
    Voici ce que je veux:

    CheckBox | Nom des fichiers | Autres colonnes | ....
    ---------------------------------------------------
    "case cochée1" exemple1.txt
    "non cochée2" exemple2.xls
    "case cochée3" exemple3.xml
    ......
    ----------------------------------------------------


    |Supprimer|
    Donc ici "case cochée1" aurait comme ID exemple1.txt, "non cochée2" -> exemple2.xls, etc..
    Et donc avec le bouton supprimer je recupérerais les ID (et donc les nom des fichiers) des checkbox pour ensuite supprimer les fichiers correspondants.

    C'est la seule solution que j'ai trouvé pour laisser le choix à l'utilisateur supprimer un ou plusieurs fichiers. Si tu connais une autre solution, je suis preneur.

    Je te suggère plutôt de générer ta colonne de Textbox en code-behind, comme les autres colonnes.
    Bon je suppose que textbox ou checkbox ca revient au meme...
    J'ai posté il n'y a pas longtemps deja un post sur comment faire ca, mais je n'ai malheureusement pas eu de reponses. Car c'est vrai que l'ideal serait de faire ce que je veux faire dans le code-behind.
    http://www.developpez.net/forums/sho...d.php?t=318045

    A+

  5. #5
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Ouaip, c'est pas la bonne façon de faire.
    Une solution courante (pas la meilleure, mais moins tordue que la tienne )

    * Tu créés ta colonne et tu mets un ID à tes checkbox (note : ASP.Net génèrera tout seul un "ClientID" unique)
    * Dans ton code behind, quand tu vas chopper ton évènement de suppression, tu boucles sur tes lignes.
    * Pour chaque ligne tu consultes l'état de la checkbox et tu supprimes la ligne associée

    Ca conviendrait ?

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Slt Mose,

    * Tu créés ta colonne et tu mets un ID à tes checkbox (note : ASP.Net génèrera tout seul un "ClientID" unique)
    En effet, je viens de regarder le code source de ma page ASP resultante, et en mettant comme ID -> "DeleteThisReport" pour chaque checkbox dans le code ASP, je me retrouve avec un ID ressemblant à MyDataGrid__ctl2_DeleteThisReport. Mais alors, comment je fais?
    Pour les checkbox, tu les crées avec le code behind (si oui, comment fais tu ca?) ou dans le code ASP (comme j'ai fait plus haut dans mon code)?

    Pour chaque ligne tu consultes l'état de la checkbox et tu supprimes la ligne associée
    En fait supprimer la ligne de ma dataGrid m'importe peu, car la dataGrid est construite grace a d'une fonction qui liste les fichiers present dans un repertoire stocké sur le serveur (un peu comme la commande dir sous DOS). Donc si jarrive à supprimer le fichier en question, alors c'est gagné car un rafraichissement de la page ASP mettra à jour la dataGrid automatiquement.

    Tu vois ce que je veux faire ou pas du tout?

    A+

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Bon ya du mieux, mais jai toujours unprobleme.

    Voici ce que jai tenté:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    protected void Grid_DeleteCommand_Click(object sender, System.EventArgs e) 
    {
    	foreach (DataGridItem item in this.MyDataGrid.Items)
    	{ 
    		CheckBox giftCheckBox = (CheckBox)item.Cells[0].FindControl("DeleteThisReport"); // colonne ou se trouve mes checkbox
    		TableCell myCell = item.Cells[1]; // colonne ou se trouve les noms de fichiers
    		this.settingsDisplay.Text += "<br />CheckBox value " +  giftCheckBox.Checked + " and " + myCell.Text;			
    	}
    }
    Avec ceci, jarrive bien a recupérer la valeur de ma checkbox, mais il y a un probleme avec item.Cells[1] (qui correspond à la colonne ou se trouve les nom de fichier). En fait, item.Cells[1].text ne me renvoie rien du tout , pourtant si je fais item.Cells[2].text, ca marche tres bien.
    La difference entre item.Cells[1] et item.Cells[2], c'est que item.Cells[1] est une HyperLinkColumn dans le code ASP, alors que item.Cells[2] est un BoundColumn (jai fait le test en remplacant le HyperLinkColumn par BoundColumn pour item.Cells[1], et ca marchait!).

    Donc ma question est donc comment récupérer la valeur d'une cellule qui est une HyperLinkColumn?

    a+

  8. #8
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par Cervantes
    Pour les checkbox, tu les crées avec le code behind (si oui, comment fais tu ca?) ou dans le code ASP (comme j'ai fait plus haut dans mon code)?
    Si tu les fais en code behind, tu dois avoir moyen de faire mydg.Rows[i].Cells[j].Controls.Add(mycheckbox);
    (de mémoire)
    Tu donnes un Name à ces checkbox (toujours le même, ASP se démerde pour générer un nom unique)
    Citation Envoyé par Cervantes
    Donc ma question est donc comment récupérer la valeur d'une cellule qui est une HyperLinkColumn?
    HyperLink joe = (HyperLink)mydg.Rows[i].Cells[j].Controls[0];
    ou encore (si tu connais son nom)
    HyperLink joe = (HyperLink) mydg.Rows[i].FindControl("myhyperlink");
    (de tête, vérifier l'orthographe exact)

  9. #9
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    HyperLink joe = (HyperLink)mydg.Rows[i].Cells[j].Controls[0];
    ou encore (si tu connais son nom)
    HyperLink joe = (HyperLink) mydg.Rows[i].FindControl("myhyperlink");
    (de tête, vérifier l'orthographe exact)
    Avec la dataGrid, je nai pas de methode Rows. Par contre jai testé ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HyperLink joeLaBanane = (HyperLink)item.Cells[1].Controls[0];
    et c'est bon j'arrive bien a recuperer la valeur des cellules de la Hyperlinkcolumn

    Si tu les fais en code behind, tu dois avoir moyen de faire mydg.Rows[i].Cells[j].Controls.Add(mycheckbox);
    La je vois pas ce que tu veux faire. Cest pas a la dataTable quìl faut ajouter les checkbox?
    Bon jai qund meme essaye ca, mais ca marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    for (int i = 0; i < myDt.Rows.Count; i++)
    {
    	CheckBox joeLaBanane = new CheckBox();
    	joeLaBanane.Enabled = false;
    	joeLaBanane.ID = "DeleteThisReport";
     
    	myDt.Rows[i].Cells[0].Controls.Add(joeLaBanane);
    }
    ici cest Cells aui n'existe pas pour Rows.
    Par ailleurs, est ce quil faudrait pas avant ajouter une colonne a la dataTable avant d'ajouter les checkBox? (dans ce cas la, qu'est ce qu'on met pour le typeof()?)

  10. #10
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par Cervantes
    La je vois pas ce que tu veux faire. Cest pas a la dataTable quìl faut ajouter les checkbox?
    Oulala, que dis-tu malheureux !
    Une DataTable c'est un objet de stockage des données en .Net.
    Une checkbox c'est un contrôle d'interface utilisateur en webform.

    Tu saisis bien la nuance ?

    De la même façon que tu récupères un contrôle HyperLink dans ta DataGrid, il va falloir ajouter une CheckBox dedans.

    Et effectivement, dans la DataGrid de .Net 1.x c'est pas Rows pour accéder aux lignes, c'est Items.

  11. #11
    Membre à l'essai
    Inscrit en
    Octobre 2004
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 28
    Points : 19
    Points
    19
    Par défaut
    Ok, merci pour cette precision.
    Avec la methode items je peux en effet acceder aux lignes.

    Bon ben je crois que c'est bon, j'ai tout ce qu'il me faut maintenant. Un grand merci pour ton aide.

    Bye.

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

Discussions similaires

  1. Probleme avec la fonction Ontimer
    Par Djule dans le forum MFC
    Réponses: 8
    Dernier message: 27/11/2005, 17h52
  2. Probleme avec la fonction rename()
    Par TheZenZen dans le forum C
    Réponses: 6
    Dernier message: 08/10/2005, 15h59
  3. [LG] Problème avec la Fonction ReadLn en fin de programme
    Par killermano dans le forum Langage
    Réponses: 6
    Dernier message: 23/07/2005, 15h16
  4. [LG]Probleme avec une fonction
    Par xavier1936 dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2005, 22h48

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