Appel a un fonction via variable

Signaler
Messages postés
24
Date d'inscription
dimanche 20 avril 2008
Statut
Membre
Dernière intervention
12 novembre 2013
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
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

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
20
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...