2010-04-29 7 views
1

J'utilise deux contrôles personnalisés. L'un recueille les critères pour une recherche, et l'autre affiche une liste. Ces deux contrôles doivent rester séparés pour le moment.Comment communiquer entre les contrôles personnalisés ASP.net

Quelle est la meilleure méthode pour transférer des données du contrôle de recherche au contrôle de liste?

Je pense à ViewState, Session ou à la fois dans un UpdatePanel et en utilisant des événements personnalisés?

+0

Deos la communication se produire sur le serveur ou le client? –

+0

Heureux que cela se produise dans les deux endroits. Une fois que le contrôle de liste a reçu les critères, il effectue un appel de service. – Kye

Répondre

1

Peut-être que vous pouvez créer un délégué et un événement pour passer une liste de valeurs de recherche? De cette façon, vous pouvez facilement ajouter un ou plusieurs contrôles d'affichage au cas où cela deviendrait nécessaire.

Notez que ceci est juste un exemple de code rapide qui devrait être optimisé/amélioré.

public class SearchControl 
{ 
    public delegate void SearchEventHandler(object sender, Dictionary<string, string> SearchValues); 
    public event SearchEventHandler OnSearch; 

    public SearchControl() 
    { 
     btnSearch.Click += new EventHandler(Search); 
    } 

    protected void Search(object sender, EventArgs e) 
    { 
     if (OnSearch != null) 
     { 
      Dictionary<string, string> searchValues = new Dictionary<string, string>(); 
      searchValues.Add("name", "John"); 
      searchValues.Add("age", "24"); 

      OnSearch(this, searchValues); 
     } 
    } 
} 

public class DisplayControl 
{ 
    public void ShowResults(Dictionary<string, string> SearchValues) 
    { 
     // Some logic here... 
    } 
} 

public class YourWebPage 
{ 
    SearchControl searcher = new SearchControl(); 
    DisplayControl displayer = new DisplayControl(); 

    public YourWebPage() 
    { 
     searcher.OnSearch += new SearchControl.SearchEventHandler(searcher_OnSearch); 
    } 

    public void searcher_OnSearch(object sender, Dictionary<string, string> SearchValues) 
    { 
     displayer.ShowResults(SearchValues); 
    } 
} 
1

Expose une propriété publique du type de données que vous avez, une méthode publique pour lier les données à votre liste

+0

Par conséquent, les contrôles de recherche exposent un objet de type Critère et le contrôle de liste se lie à ce type? – Kye

+0

si cela ne vous dérange pas tout avoir un accès public au contrôle de recherche, bien sûr, pourquoi ne pas – TheGeekYouNeed

0

Cela dépend de l'endroit où la recherche est effectuée et les données sont transférées entre les commandes. À mon avis, il est probablement préférable de simplement passer les critères à la page et d'avoir la page exécuter la recherche les lier au contrôle de la liste pour afficher les résultats.

1

Si les contrôles sont séparés, ils ne devraient probablement pas communiquer directement. Après tout, la plupart des autres contrôles .NET ne communiquent pas non plus directement. Je ne peux penser qu'à deux exceptions: les contrôles enfants/parents communiquent parfois des informations de base; et les contrôles liés aux données communiquent parfois directement avec un DataSource. Mais c'est largement ça.

Si vous avez besoin de raccorder deux contrôles adjacents, la manière "normale" de le faire est que leur conteneur en prenne soin. Par exemple, si un clic sur un bouton affecte le texte sur l'étiquette, c'est la Page (conteneur pour les deux) qui gère l'événement Click et définit la propriété Text. Vous pouvez également donner à votre ListControl une propriété appelée FindControl et l'affecter dans Page_Init ou quelque chose. Mais si le couplage est si serré, vous pourriez vous demander s'il ne vaudrait pas mieux fusionner les contrôles.

Questions connexes