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 :

Erreur CS0117 sur mes UserControls


Sujet :

ASP.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut Erreur CS0117 sur mes UserControls
    Salut, je développe un site web en C# avec Visual Studio 2005, et j'ai une erreur CS0117 sur une page lorsque je compile. Les objets soulignés sont deux usercontrols.
    L'erreur CS0117 correspond au message suivant :
    'type' ne contient pas de définition pour 'identificateur'
    (en anglais ça donne : 'type' does not contain a definition for 'identifier')
    À la place de 'type' il y a le nom de ma page, et à la place de 'identificateur', il y a le nom de l'suercontrol.

    Pourtant l'objet existe bel et bien, il est d'ailleurs reconnu par l'interface (lorsque je fais Ctrl+espace par exemple).

    Sur cette page, il est indiqué que l'erreur est inhérente à la conception, et sur cette page, il est marqué quatre raisons possibles, mais aucune ne me semble correspondre à mon cas...
    Cela dit, je travaille avec VS2005 qui utilise des classes partielles, et donc je n'ai pas accès à l'instantiation des objets ajoutés sur la page aspx...

    Je précise que cela ne concerne qu'une seule page.

    Quelqu'un a-t-il déjà eu ce problème ?


    Merci d'avance !!

  2. #2
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    Un petit bout de code de la page qui génère l'erreur serait le bienvenu :-)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut
    En fait, c'est à chaque utilisation de l'objet UserControl, donc je sais pas si montrer le code sert à grand chose mais voilà quand même :

    D'abord un extrait de la page aspx (mon usercontrol s'appelle donc tblAccessoires) :

    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
    <%@ Register TagPrefix="uc1" TagName="S4eTableau" Src="../S4e/S4eTableau.ascx" %>
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="detailConsole.aspx.cs" Inherits="pages_detailConsole" %>
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <body>
        <form id="form1" runat="server">
        <div><uc1:HautPage runat="server" id="HautPage1"></uc1:HautPage></div>
        <table class="libelle" width="80%" align=left>
            <tr>
                <td width="10%"></td>
                <td colspan="2" width="635" valign="top">Accessoires de la console : &nbsp;<asp:LinkButton ID="lnkAjouterAccessoires" runat="server" CssClass="formulaire" Text="[Ajouter des accessoires]"></asp:LinkButton>
                <uc1:S4eTableau id="tblAccessoires" runat="server"></uc1:S4eTableau></td>
                <td></td>
            </tr>
        </table>
        </form>
    </body>
    </html>
    Et maintenant un extrait du code source :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    tblAccessoires.showDelButton = true;
    this.tblAccessoires.showDelButton = true;
    À noter une chose intéressante lors de la compilation :
    La première ligne de code (sans le "this") renvoie l'erreur suivante :
    CS0103: Le nom 'tblAccessoires' n'existe pas dans le contexte actuel
    Alors que la seconde ligne de code (avec "this") renvoie l'erreur :
    CS0117: 'pages_detailConsole' ne contient pas de définition pour 'tblAccessoires'
    Et pourtant, je répère que l'EDI reconnait le nom de l'objet !

  4. #4
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    N'y aurait-il pas moyen d'avoir le code du UserControl également ?

    De plus, je suppose qu'il manque une ligne <%@ Register pour le <uc1:HautPage non ?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut
    Oui j'ai effectivement oublié de copier le <%@ Register pour le <uc1:HautPage mais c'est sans rapport avec le problème...

    Sinon le code du S4eControl est assez basique...
    Voilà la partie dans le fichier ascx :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="S4eTableau.ascx.cs" Inherits="S4e_S4eTableau" %>
    <asp:Panel runat="server" id="S4eTable" Visible="True">
    	<table width="100%" cellpadding="0" cellspacing="0">
    		<TR>
    			<TD width="100">&nbsp;</TD>
    			<TD>
    			    <asp:Table ID="table" runat="server" EnableViewState="true" Width="100%"></asp:Table>
    				<asp:label id="lblNoResult" Runat="server" EnableViewState="False"></asp:label></TD>
    		</TR>
    	</TABLE>
    </asp:Panel>
    Et voilà la partie dans le fichier ascx.cs :
    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
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    using System;
    using System.Collections;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Configuration;
    using log4net;
     
    /// <summary>
    /// Tableau similaire au datagrid mais simplifié (avec postback sur la suppression)
    /// </summary>
    public partial class S4e_S4eTableau : System.Web.UI.UserControl
    {
        private static readonly ILog logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
     
        #region attributs privés
        private bool _showFirstColumn = false;
        private bool _showDelButton = false;
        private float[] _columnSize = null;
        private string _noResultMessage = "Aucun élément dans ce tableau";
        private DataSet _dataSource = null;
        #endregion
        #region attributs publics
        /// <summary>
        /// Affichage ou non de la première colonne
        /// </summary>
        public bool showFirstColumn
        {
            get { return this._showFirstColumn; }
            set { this._showFirstColumn = value; }
        }
     
        /// <summary>
        /// Affichage ou non d'une colonne proposant la suppression de la ligne
        /// </summary>
        public bool showDelButton
        {
            get { return this._showDelButton; }
            set { this._showDelButton = value; }
        }
     
        /// <summary>
        /// Taille des colonnes
        /// On compte la première colonne, même si elle n'est pas affichée
        /// On compte la colonne du bouton supprimer s'il est présent
        /// Si la valeur est nulle, toutes les colonnes auront la même taille
        /// </summary>
        public float[] columnSize
        {
            get { return this._columnSize; }
            set { this._columnSize = value; }
        }
     
        /// <summary>
        /// Message à afficher si le tableau est vide
        /// </summary>
        public string noResultMessage
        {
            get { return this._noResultMessage; }
            set { this._noResultMessage = value; }
        }
     
        /// <summary>
        /// DataSet contenant les informations à afficher
        /// </summary>
        public DataSet dataSource
        {
            get { return this._dataSource; }
            set { this._dataSource = value; }
        }
        #endregion
     
        protected void Page_Load(object sender, EventArgs e)
        {
        }
     
        public void DataBind()
        {
            if (_dataSource != null)
            {
                // on affiche le bon composant
                table.Visible = true;
                lblNoResult.Visible = false;
                // on construit le tableau
                DataTable dt = _dataSource.Tables[0];
                int nbCol = dt.Columns.Count;
                int nbRow = dt.Rows.Count;
                // si la taille des colonnes ne correspond pas au nombre des colonnes, on passe au mode par défaut
                if (_columnSize != null && ((!_showDelButton && _columnSize.GetLength(0) != nbCol) || (_showDelButton && _columnSize.GetLength(0) != (nbCol + 1))))
                    _columnSize = null;
     
                // ligne d'entete
                TableRow trHeader = new TableRow();
                for (int i = 0; i < nbCol; i++)
                {
                    TableCell tc = new TableCell();
                    tc.Text = dt.Columns[i].Caption;
                    if (_columnSize != null)
                        tc.Width = Unit.Percentage(_columnSize[i]);
                    trHeader.Cells.Add(tc);
                }
                // colonne de suppression
                if (_showDelButton)
                {
                    TableCell tc = new TableCell();
                    tc.Text = "Supprimer";
                    if (_columnSize != null)
                        tc.Width = Unit.Percentage(_columnSize[nbCol]);
                    trHeader.Cells.Add(tc);
                }
                trHeader.CssClass = ConfigurationManager.AppSettings["CSS-DataGridHeader"];
                dt.Rows.Add(trHeader);
     
                // lignes du tableau
                for (int i = 0; i < nbRow; i++)
                {
                    TableRow tr = new TableRow();
                    for (int j = 0; j < nbCol; j++)
                    {
                        TableCell tc = new TableCell();
                        tc.Text = dt.Rows[i][j].ToString();
                        if (_columnSize != null)
                            tc.Width = Unit.Percentage(_columnSize[j]);
                        tc.CssClass = ConfigurationManager.AppSettings["CSS-DataGridItemCell"];
                        tr.Cells.Add(tc);
                    }
                    #region gestion du bouton de suppression
                    if (_showDelButton)
                    {
                        TableCell tc = new TableCell();
                        ImageButton imgBtn = new ImageButton();
                        imgBtn.Click += new System.Web.UI.ImageClickEventHandler(imgBtn_Click);
                        imgBtn.ID = "Suppr" + tr.Cells[0].Text;
                        imgBtn.ImageUrl = ConfigurationManager.AppSettings["DOSSIER-IMAGES"] + ConfigurationManager.AppSettings["IMG-DataGridDeleteMouseOut"];
                        imgBtn.Attributes.Add("onMouseOver", "this.src='" + ConfigurationManager.AppSettings["DOSSIER-IMAGES"] + ConfigurationManager.AppSettings["IMG-DataGridDeleteMouseOver"] + "'");
                        imgBtn.Attributes.Add("onMouseOut", "this.src='" + ConfigurationManager.AppSettings["DOSSIER-IMAGES"] + ConfigurationManager.AppSettings["IMG-DataGridDeleteMouseOut"] + "'");
                        tc.Controls.Add(imgBtn);
                        tc.VerticalAlign = VerticalAlign.Middle;
                        tc.HorizontalAlign = HorizontalAlign.Center;
                        tc.CssClass = ConfigurationManager.AppSettings["CSS-DataGridItemCell"];
                        if (_columnSize != null)
                            tc.Width = Unit.Percentage(_columnSize[nbCol]);
                        tr.Cells.Add(tc);
                    }
                    #endregion
                    if (i % 2 == 0)
                        tr.CssClass = ConfigurationManager.AppSettings["CSS-DataGridItem"];
                    else
                        tr.CssClass = ConfigurationManager.AppSettings["CSS-DataGridItemAlternate"];
                    dt.Rows.Add(tr);
                }
     
                // mise en forme du tableau
                this.table.BorderWidth = Unit.Pixel(1);
                this.table.BorderStyle = BorderStyle.NotSet;
            }
            else
            {
                // le tableau est vide
                table.Visible = false;
                lblNoResult.Visible = true;
                lblNoResult.Text = _noResultMessage;
            }
        }
     
        void imgBtn_Click(object sender, System.Web.UI.ImageClickEventArgs e)
        {
            throw new Exception("The method or operation is not implemented.");
        }
    }
    J'ai créé ce usercontrol à partir de rien, et à la compilation je n'ai pas eu de problème sur le code. Par contre lorsque je l'utilise dans la page detailConsole, ça merde...
    En revanche, je viens de l'utiliser sur une autre page et là, pas de problème !!

    J'en viens à me dire que le problème est lié à la génération du code contenu dans la classe partagée à laquelle je n'ai pas accès ; là où l'objet est instancié...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 119
    Points : 55
    Points
    55
    Par défaut
    J'ai trouvé d'où venait le problème, et c'est très con (comme la plupart des problèmes qu'on ne comprend pas) :
    En fait j'avais fait une copie des fichiers detailConsole.aspx et detailConsole.aspx.cs dans le répertoire de travail, et VS2005 inclue automatiquement les fichiers présent dans le répertoire de travail dans le projet (ce que ne faisait pas automatiquement VS2002 il me semble)... Et comme "copie de detailConsole.aspx" pointe toujours vers detailConsole.aspx.cs, et que les deux fichiers aspx ne contenaient pas les mêmes composants, ça buggait forcément...

    Donc c'est très con, ça fait perdre du temps pour rien, mais au moins c'est réglé...

  7. #7
    Membre expert
    Avatar de Pongten
    Homme Profil pro
    IT Analyst & Software Developer
    Inscrit en
    Juin 2002
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : IT Analyst & Software Developer
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 173
    Points : 3 543
    Points
    3 543
    Par défaut
    En effet :-)

    Par contre, petit conseil, ajoute le mot new devant ta méthode DataBind dans ton UserControl -> public new void DataBind

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

Discussions similaires

  1. [MVVM] OnpropertyChange non repercuté sur mes Usercontrol
    Par igorzup dans le forum Windows Presentation Foundation
    Réponses: 32
    Dernier message: 05/10/2012, 12h21
  2. [HTML 4.0] Erreur sur mes pages de code - site invalide
    Par hugo07 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/06/2009, 20h47
  3. Réponses: 7
    Dernier message: 24/10/2007, 14h28
  4. Réponses: 1
    Dernier message: 05/02/2007, 13h27

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