Appel a un fonction via variable

byrong Messages postés 24 Date d'inscription dimanche 20 avril 2008 Statut Membre Dernière intervention 12 novembre 2013 - Modifié par byrong le 19/10/2013 à 11:33
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 11 nov. 2013 à 14:43
Bonjour,

VOila mon code:


<asp:Button ID="Button1" runat="server" Text='<%# Eval("Caption") %>' CommandName='<%# Eval("NomFonction") %>' />

J'aimerais que l'évènement "Click" soit lié à une fonction dont le nom est définis dans une variable string.

Pouvez-vous m'aider?

Merci

RESOLU

1 réponse

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
11 nov. 2013 à 14:43
Salut,

Comme je ne sais pas si tu parles d'un click coté client ou d'un click serveur, je montre les 2.

pour un "click serveur", c'est pas possible directement, mais tu peux contourner en le faisant par reflexion
Pour le "click client", pas de problème.

1 : La déclaration du bouton

<asp:Button ID="Button1" runat="server" Text="unBouton" OnClientClick="genericFunc()" OnClick="GetClickServer" />


2 : la classe principale (WebForm) contient 2 membres string pour les noms des fonctions (client et serveur) qui peuvent bien sur varier, c'est le but.

private string _strServerFuncName = "serverFunc2"; // une méthode serveur (C#)

private string _strClientFuncName = "clientFunc1"; // une fonction client (javascript)
public string ClientFuncName {get { return _strClientFuncName; }}


3 : Pour l'appel client, Dans le head de la page :

<script type="text/javascript">
    function genericFunc() {
        eval('<%=this.ClientFuncName %>()');
    }
    function clientFunc1() {
        alert("clientFunc1");
    }
    function clientFunc2() {
        alert("clientFunc2");
    }
</script>


Pour l'appel serveur, il faut une petite classe contenant les
différentes méthodes à appeler

public class Obj
{
    public Obj() { }

    public void serverFunc1(object sender, EventArgs e, HttpContext context)
    {
        context.Response.Write("serverFunc1 clicked...");
    }

    public void serverFunc2(object sender, EventArgs e, HttpContext context)
    {
        context.Response.Write("serverFunc2 clicked...");
    }
}


Et enfin, le click générique
On passe le HttpContext en paramètre afin de pouvoir dialoguer avec le formulaire aspnet

/// <summary>
/// Click générique dans la webForm
/// </summary>
protected void GetClickServer(object sender, EventArgs e)
{
    Type t = typeof(Obj);
    BindingFlags commonFlags = BindingFlags.DeclaredOnly|BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance;
        
    // Crée l'instance du type contenant les fonctions
    Object obj = t.InvokeMember(
        null,
        commonFlags | BindingFlags.CreateInstance, 
        null, 
        null,
        null);

    // Invoke la fonction appropriée
    t.InvokeMember(
        _strServerFuncName, // serverFunc1 ou serverFunc2
        commonFlags | BindingFlags.InvokeMethod,
        null,
        obj,
        new object[] { sender, e, this.Context });
}



Il y a certainement d'autre façons de faire.

bye...
0
Rejoignez-nous