2010-01-27 4 views
0

J'ai un contrôle personnalisé sur mon formulaire web:Impossible d'obtenir le contrôle personnalisé

<form id="form" runat="server"> 
     <clc:CustomList 
     ID="myList" 
     runat="server" 
     AddButtonText="add" 
     DeleteButtonText="del" 
     MoveUpButtonText="up" 
     MoveDownButtonText="down"/> 
     <div id="test" runat="server"></div> 
</form> 

Je dois arriver à ce contrôle à partir d'un WebMethod statique. Je reçois l'objet Page à partir de HttpContext actuel, mais il semble que cet objet page n'a pas de contours (le nombre de contrôles est 0).

[WebMethod] 
public static List<CustomListControl.IListItem> GetListItems() 
{ 
    Page page = HttpContext.Current.Handler as Page; 

    Control control = null; 

    if (page != null) 
    { 
     control = FindControlRecursive(page, "myList"); 
    } 
    return null; 
} 

private static Control FindControlRecursive(Control root, string id) 
{ 
    if (root.ID == id) 
    { 
     return root; 
    } 

    foreach (Control c in root.Controls) 
    { 
     Control t = FindControlRecursive(c, id); 
     if (t != null) 
     { 
      return t; 
     } 
    } 

    return null; 
} 

Une idée pourquoi ou comment accéder à mon contrôle? Merci!

Répondre

0

Essayez avec un contrôle standard à l'intérieur de la page.
Si vous pouvez le trouver par ID, alors vous avez probablement fait quelque chose de mal en enregistrant votre contrôle personnalisé (peut-être que vous pourriez fournir tout le code aspx?).
Notez également que la classe Page a une méthode intégrée FindControl.

Par exemple, cela devrait fonctionner:

<form id="form1" runat="server"> 
<div> 
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> 
</div> 
</form> 

et dans le fichier .cs:

protected void Page_Load(object sender, EventArgs e) { 
    var tb = FindControl("TextBox1"); 
} 
+0

Je peux obtenir le contrôle de l'événement Page_Load. Je ne peux pas l'atteindre à partir de WebMethod statique (semble que l'objet Page que je reçois de l'actuel HttpContext n'est pas l'objet réel de la page:>) ... – Heko

0

Je poste comme ça, je peux ajouter le code ...

ASPX:

<%@ Register Assembly="CustomListControl" Namespace="CustomListControl" TagPrefix="clc" %> 
<%@ Import Namespace="System.Web.Services" %> 

<!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"> 
<head id="head" runat="server"> 
    <title>MyList</title> 
</head> 
<body> 
    <form id="form" runat="server"> 
     <clc:CustomList 
      ID="myList" 
      runat="server" 
      AddButtonText="add" 
      DeleteButtonText="del" 
      MoveUpButtonText="up" 
      MoveDownButtonText="down"/> 
      <div id="test" runat="server"></div> 
    </form> 
</body> 
</html> 

Même si je faire

[WebMethod] 
public static List<CustomListControl.IListItem> GetListItems() 
{ 
    Page page = HttpContext.Current.Handler as Page; 

    if (page != null) 
    { 
     var c = page.FindControl("myList"); 
    } 
    return null; 
} 

J'ai obtenu c = null; Je n'arrive pas à trouver le contrôle de formulaire même à partir de cet objet page ...

Si je fais var c = this.FindControl ("myList") est l'événement de chargement de la page, j'arrive au contrôle. Le problème est parce que je ne peux pas obtenir contorl forme statique WebMethod ...

Une idée pourquoi?

1

Vous ne pouvez pas accéder à la plupart des propriétés et méthodes de l'instance de page et tous les contrôles de la page à partir de la méthode de page. Pourquoi? Parce que l'appel de méthode page n'est pas une publication, ce qui signifie qu'il ne passe pas par le cycle de vie de la page, viewstate n'est pas disponible et les contrôles ne sont pas créés. Essayez d'utiliser un UpdatePanel à la place.

+0

J'ai un contrôle personnalisé (liste des éléments avec l'édition en ligne, jQuery glisser et déposer, ajouter et supprimer des fonctionnalités). Lorsque le client effectue une modification, le nouvel état doit être (ajax) publié sur le serveur (contrôle). Comment capturer ces événements à partir de UpdatePanel? Est-il préférable de faire un UpdatePanel à l'intérieur d'un contrôle personnalisé? J'ai besoin de quelque chose comme ceci: contrôle personnalisé avec des actions qui font ajax post du client au serveur quand certains événements se produisent sur le contrôle. Des idées comment faire cela? – Heko

+0

Par défaut, tous les contrôles de publication dans un panneau de mise à jour déclenchent une publication partielle.Vous pouvez également créer des contrôles en dehors du UpdatePanel en tant que déclencheurs ou utiliser __doPostBack pour déclencher manuellement une publication partielle à l'aide de javascript. Votre contrôle doit publier un événement auquel vous pouvez vous abonner à partir de la page, vous pouvez ensuite placer votre code dans le gestionnaire d'événements. –

0

Les membres statiques ne peuvent pas référencer les références d'instance. Vous devrez transmettre une référence à HttpContext ou à la page elle-même à partir d'une autre méthode d'instance de la classe. Je dirais que vous devez appeler le service Web statique avec un paramètre comme celui-ci:

protected void Page_Load(object sender, EventArgs e) { 
    var tb = GetListItems(this); 
} 

[WebMethod] 
public static List<CustomListControl.IListItem> GetListItems(System.Web.UI.Page page) 
{ 
    var c = null;  

    if (page != null) 
    { 
     c = page.FindControl("myList"); 
    } 
    return c; 
} 
Questions connexes