none
Comment accéder aux propriétés d'un controle à partir d'une fonction générale placée dans App_Code? RRS feed

  • Question

  • Bonjour a tous,
    Est-il possible d'agir sur les contrôles d'un formview à partir d'une classe placée dans App_code?

    Voici un exemple pour illustrer plus clairement ce que je voudrais faire:

    j'ai mon application qui se compose d'un form view dans lequel j'ai 5 champs DropDownList: A,B,C,D,E
    Je vais mettre en place cette application chez deux clients: TOTO et TITI.
    pour le client TOTO, le champ A aura une liste de valeur {x,y,z}, et si la valeur saisie par l'utilisateur est 'x', le fond sera rouge, sinon il sera bleu.
    Pour mon client TITI, le champ A sera une dropdownList avec des valeurs {a,b,c,d} , le colour background sera bleu et la propriété text sera initialisée à 'hello'
    Je voudrais donc dans ce cas avoir mon form view avec mes champs A,B,C,D,E puis avoir une class ma_class.cs dans laquelle je viendrais paramétrer les besoins spécifiques de TOTO et de TITI.

    (le but est de faciliter l'évolution et la maintenance de mon application, tout en gardant une souplesse de paramétrage pour chacun de mes clients)

    Est-ce qu'il est possible d'agir sur les contrôles de mon form view à partir de ma classe? (donc faire qqc comme FormView1.A.BackColor = "#FFFF00" à partir de ma_classe.cs, ou FormView1.A.text="Hello")

    Il y aurait il d'autres solutions plus facile? (je voudrais au maximum éviter le javascript et priviligier le code Behind)

    Merci de votre aide


    Damien
    lundi 8 février 2010 16:20

Réponses

  • Bonjour,

    si depuis une méthode du repertoire App_Code vous voulez modifier un composant situé dans un FormView ou dans un autre composant vous pouvez utiliser la méthode FindControl pour trouvez un composant avec son ID.

    Par exemple avec une page contenant le un FormView et une Combo

    <form id="form1" runat="server">
        <div>
            <asp:FormView ID="FormView1" runat="server">
                <ItemTemplate>
                    <asp:DropDownList ID="dropdown" runat="server">
                        <asp:ListItem>Item 1</asp:ListItem>
                        <asp:ListItem>Item 2</asp:ListItem>
                        <asp:ListItem>Item 3</asp:ListItem>
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:FormView>
            <asp:Button ID="Change" Text="Change" runat="server" OnClick="Change_Click" />
        </div>
    </form>
    Vous pouvez écrire une méthode comme celle ci :

     public static void SetDropDownColor(FormView formView, string ctlName, System.Drawing.Color color)
     {
        DropDownList dropDown = formView.FindControl(ctlName) as DropDownList;
    
        if (dropDown != null)
          dropDown.BackColor = color;
     }
    et l'utiliser depuis le code behind :

    protected void Change_Click(object sender, EventArgs e)
    {
     ChangeFormView.SetDropDownColor(this.FormView1, "dropdown", System.Drawing.Color.Blue);
    }

    Cordialement

    lundi 8 février 2010 22:46
    Modérateur
  • Merci beaucoup de votre aide! ca marche bien, et j'ai même développé votre idée pour aller encore plus loin:
    En code behind de mon formview, j'ai mis:

    protected void Page_Load(object sender, EventArgs e)
    {
         //tout mon code vient se mettre ici
    
        //j'appelle ici ma méthode dans laquelle je viendrai paramétrer tous les besoins de mon client
         CustomEvents ce = new CustomEvents();
         ce.cs_Styles_load(fvStyle);
    }
    Cette page fait partie du code source et évoluera de la même manière pour chacun des clients.
    Dans ma classe CustomEvents, je procède comme ceci:

    public class CustomEvents
    {
    
        public void cs_Styles_load(FormView fv)
        {
            //Put here all custom code that will be executed in the Main information
            CustomEvents ce = new CustomEvents();
    
            if (fv != null)
            {
                ce.SetStatusColor(fv, "FIELD_A");
                ce.SetMyFieldInvisible(fv,"FIELD_B");
            }
        }
    
        //set the color of a field
        public void SetStatusColor(FormView formView, string ctlName)
        {
            TextBox tbStatus = (TextBox)formView.FindControl(ctlName);
    
            if (tbStatus != null)
                tbStatus.BackColor = ColorTranslator.FromHtml("#FF00FF");
        }
    
        //make a field invisible
        public void SetMyFieldInvisible(FormView formView, string ctlName)
        {
            TextBox tbfield = (TextBox)formView.FindControl(ctlName);
            if (tbfield != null)
            {
                tbfield.Visible = false;
            }
    
        }
    }
    et ainsi, on peut agir sur chacun des textbox et/ou label voire même si on le voulait, redéfinir le layout de la page en restant indépendant du code source.
    Lors d'une montée de version, on laisserait ces fichiers spécifiques au client, et le client garderait ainsi ses paramètres.
    Merci beaucoup de vos pistes et bonne journée.

    Damien
    • Marqué comme réponse Neimadtasum mardi 9 février 2010 10:49
    mardi 9 février 2010 10:48

Toutes les réponses

  • Bonjour,

    si depuis une méthode du repertoire App_Code vous voulez modifier un composant situé dans un FormView ou dans un autre composant vous pouvez utiliser la méthode FindControl pour trouvez un composant avec son ID.

    Par exemple avec une page contenant le un FormView et une Combo

    <form id="form1" runat="server">
        <div>
            <asp:FormView ID="FormView1" runat="server">
                <ItemTemplate>
                    <asp:DropDownList ID="dropdown" runat="server">
                        <asp:ListItem>Item 1</asp:ListItem>
                        <asp:ListItem>Item 2</asp:ListItem>
                        <asp:ListItem>Item 3</asp:ListItem>
                    </asp:DropDownList>
                </ItemTemplate>
            </asp:FormView>
            <asp:Button ID="Change" Text="Change" runat="server" OnClick="Change_Click" />
        </div>
    </form>
    Vous pouvez écrire une méthode comme celle ci :

     public static void SetDropDownColor(FormView formView, string ctlName, System.Drawing.Color color)
     {
        DropDownList dropDown = formView.FindControl(ctlName) as DropDownList;
    
        if (dropDown != null)
          dropDown.BackColor = color;
     }
    et l'utiliser depuis le code behind :

    protected void Change_Click(object sender, EventArgs e)
    {
     ChangeFormView.SetDropDownColor(this.FormView1, "dropdown", System.Drawing.Color.Blue);
    }

    Cordialement

    lundi 8 février 2010 22:46
    Modérateur
  • Merci beaucoup de votre aide! ca marche bien, et j'ai même développé votre idée pour aller encore plus loin:
    En code behind de mon formview, j'ai mis:

    protected void Page_Load(object sender, EventArgs e)
    {
         //tout mon code vient se mettre ici
    
        //j'appelle ici ma méthode dans laquelle je viendrai paramétrer tous les besoins de mon client
         CustomEvents ce = new CustomEvents();
         ce.cs_Styles_load(fvStyle);
    }
    Cette page fait partie du code source et évoluera de la même manière pour chacun des clients.
    Dans ma classe CustomEvents, je procède comme ceci:

    public class CustomEvents
    {
    
        public void cs_Styles_load(FormView fv)
        {
            //Put here all custom code that will be executed in the Main information
            CustomEvents ce = new CustomEvents();
    
            if (fv != null)
            {
                ce.SetStatusColor(fv, "FIELD_A");
                ce.SetMyFieldInvisible(fv,"FIELD_B");
            }
        }
    
        //set the color of a field
        public void SetStatusColor(FormView formView, string ctlName)
        {
            TextBox tbStatus = (TextBox)formView.FindControl(ctlName);
    
            if (tbStatus != null)
                tbStatus.BackColor = ColorTranslator.FromHtml("#FF00FF");
        }
    
        //make a field invisible
        public void SetMyFieldInvisible(FormView formView, string ctlName)
        {
            TextBox tbfield = (TextBox)formView.FindControl(ctlName);
            if (tbfield != null)
            {
                tbfield.Visible = false;
            }
    
        }
    }
    et ainsi, on peut agir sur chacun des textbox et/ou label voire même si on le voulait, redéfinir le layout de la page en restant indépendant du code source.
    Lors d'une montée de version, on laisserait ces fichiers spécifiques au client, et le client garderait ainsi ses paramètres.
    Merci beaucoup de vos pistes et bonne journée.

    Damien
    • Marqué comme réponse Neimadtasum mardi 9 février 2010 10:49
    mardi 9 février 2010 10:48