Bonjour,

Ma question se pose dans le cadre d'un site web asp.net/C# 3.5.

J'ai un UpdatePanel UP1 auquel est associé deux triggers (2 éléments à cliquer situés dans un UpdatePanel UP0). Je voudrais, lorsque l'un des triggers se déclenche, pouvoir récupérer ses informations (l'id, le texte de l'élément cliqué) pour pouvoir rafraîchir UP1 avec une méthode qui prend des paramètres.

Donc a priori c'est tout indiqué d'utiliser AsyncPostBackSourceElementID pour récupérer l'élément (http://msdn.microsoft.com/en-us/libr...elementid.aspx).

Le code suivant fonctionne pour la premier des deux triggers, mais pour le 2e il me fait une erreur javascript bizarroïde dans firebug, et l'ID récupéré est celui du 1er trigger, pas de celui cliqué (j'affiche cette ID dans le TextBox "Debug" situé dans UP1).

Le trigger est un contrôle utilisateur personnalisé FbFolder qui est en gros un Label cliquable et s'affiche avec une icône suivie d'un texte (voir son code plus bas). Et c'est cela qui pose souci, car un asp:Button fonctionne tout bien à la place. Ah ces user controls...

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
 
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true">
 
        <asp:UpdatePanel ID="UP0" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
        <ContentTemplate>
        <mycontrols:FbFolder runat="server" ID="T1" Text="Lien1" Level="0" OnClick="UP0_ElementClick"></mycontrols:FbFolder>
        <mycontrols:FbFolder runat="server" ID="T2" Text="Lien2" Level="-1" OnClick="UP0_ElementClick"></mycontrols:FbFolder>
 
        </ContentTemplate>
        </asp:UpdatePanel>
 
        <asp:UpdatePanel ID="UP1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false" OnLoad="UP1_Load">
        <ContentTemplate>
        <asp:TextBox Width="100" ID="Debug" runat="server" />
        <asp:PlaceHolder runat="server" ID="UP1_PL" />
        </ContentTemplate>
        <Triggers>
        <asp:AsyncPostBackTrigger ControlID="T1" EventName="Click" />
        <asp:AsyncPostBackTrigger ControlID="T2" EventName="Click" />
        </Triggers>
        </asp:UpdatePanel>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
public void UP0_ElementClick(object sender, EventArgs e)
    {
       // rien
    }
 
    public void UP1_Load(object sender, EventArgs e)
    {
        string id = ScriptManager1.AsyncPostBackSourceElementID;
        Debug.Text = id;
    }
Portions de code significatives de FbFolder (je n'écris pas les attributs qui persistent dans le ViewState par gain de place, ni la méthode de rendu html) :
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
 
public class FbFolder : WebControl, IPostBackEventHandler
    {
public event EventHandler Click;
 
        protected void OnClick(EventArgs e)
        {
 
            if (Click != null)
            {
 
                Click(this, e);
            }
            // for itemCommand firing
            base.RaiseBubbleEvent(this, e);
 
 
        }
 
        public void RaisePostBackEvent(string eventArgument)
        {
 
            this.OnClick(EventArgs.Empty);
        }
protected override void Render(HtmlTextWriter writer)
        {
 
            if (this.Page != null)
            {
 
                // indispensable pour que les propriétés du contrôle soient postées
 
                this.Page.VerifyRenderingInServerForm(this);
 
            }
 
            base.Render(writer);
 
        }
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
 
            base.AddAttributesToRender(writer);
 
            string DoPostBack =
 
             this.Page.ClientScript.GetPostBackEventReference(new PostBackOptions(this));
 
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, DoPostBack);
 
        }
}
Merci pour le coup de pouce.

Barbara