2009-06-06 6 views
1

C'est quelque chose qui m'a toujours intrigué.Question sur les événements et les contrôles du serveur personnalisé

Si je veux effectuer un contrôle personnalisé, dans ce cas un enfant du contrôle Datagrid, mais je veux m'assurer que lorsque je passe la souris sur une cellule spécifique, il y a une couleur de survol. Si la grille de données n'a aucune disposition pour le faire (pour l'argument), dois-je obtenir les coordonnées de la souris par rapport à la cellule et ensuite mettre en évidence la cellule la plus proche?

Merci

Répondre

2

couleur de roulement doivent être définies à l'aide de feuilles de style, ou JavaScript. Cela ne serait pas directement contrôlé par ASP.NET. Votre contrôle serveur doit générer des classes CSS à utiliser pour définir les styles de survol ou générer du code JavaScript intégré. Utilisation de CSS est la meilleure option, mais il ne fonctionnera pas dans IE6 (et peut-être IE7, je ne me souviens pas). Cet exemple suppose que votre contrôle génère la grille de données en tant que table HTML. Comme votre question dit "contrôles serveur personnalisés", cela peut être différent si vous restituez votre contrôle avec un balisage différent. Assurez-vous que votre table a une classe CSS de MyDataGridClass.

.MyDataGridClass td:hover { 
    background: #999; 
} 

Si vous voulez mettre en évidence une ligne entière, vous devrez changer td-tr dans l'exemple ci-dessus.

Si vous voulez un style de survol dans IE6 et que vous ne devez mettre en évidence qu'une seule cellule, vous pouvez faire mieux en utilisant une balise <a /> dans chaque cellule. IE6 implémente le pseudo-sélecteur de vol stationnaire correctement il ne fonctionne que sur <a /> balises, ce qui est la raison pour laquelle cela fonctionnera, mais ce qui précède sera pas dans IE6:

.MyDataGridClass a { 
    display: block; 
    width: 100%; 
    height: 100%; 
    padding: 0px; 
    margin: 0px; 
} 

.MyDataGridClass a:hover { 
    background: #999; 
} 

Cet exemple suppose, bien sûr, que vous avez la possibilité d'intégrer des CSS dans la page sur laquelle votre contrôle sera placé. Si, pour une raison quelconque, vous n'avez pas cette option, vous pouvez utiliser la route JavaScript, mais ce n'est pas la meilleure façon de faire les choses. Si vous souhaitez savoir comment utiliser JavaScript, n'hésitez pas à nous le faire savoir.

MISE À JOUR:
La section ci-dessous aborde le premier commentaire que vous avez laissé. J'ai conservé l'original au cas où quelqu'un le trouverait utile.


Afin de créer un événement de contrôle conduit, vous devez mettre en œuvre le IPostBackEventHandler ou IPostBackDataHandler. Si vous avez besoin de comprendre la différence entre ces deux interfaces, vous pouvez see this question. Je préférerais ne pas inclure les détails ici car cela rendrait cette réponse trop longue.

Cet exemple utilise le IPostBackEventHandler, mais le IPostBackDataHandler est assez similaire.

Vous devez faire quelques petites choses pour gérer les événements postback:

  • Créer une clé à utiliser comme identifiant pour votre événement. Ceci est utilisé pour la collection clé/valeur base.Event. Dans cet exemple, j'utilise l'objet _EventClick.
  • Configurez/enregistrez votre événement avec base.Events[] afin que les abonnés aux événements soient maintenus entre les publications.
  • Lors du rendu de votre contrôle, appelez le . Cela va générer un appel de fonction à la méthode JavaScript __doPostBack d'ASP.NET. Vous pouvez utiliser ce script dans n'importe quel attribut d'événement JavaScript rendu.

Il s'agit d'une recréation très minimale du contrôle ASP.NET LinkButton. La plupart de la "magie" se produit dans les méthodes AddAttributesToRender() et RaisePostBackEvent().

public class ControlWithEvent : WebControl, IPostBackEventHandler 
{ 
    private object _EventClick = new object(); 

    protected override HtmlTextWriterTag TagKey 
    { 
     get { return HtmlTextWriterTag.A; } 
    } 

    public event EventHandler Click 
    { 
     add 
     { 
      base.Events.AddHandler(_EventClick, value); 
     } 
     remove 
     { 
      base.Events.RemoveHandler(_EventClick, value); 
     } 
    } 

    public void RaisePostBackEvent(string eventArgument) 
    { 
     // The value of the 'eventArgument' parameter will be "myOptions" 
     EventHandler handler = (EventHandler)base.Events[_EventClick]; 
     if (handler != null) 
     { 
      handler(this, EventArgs.Empty); 
     } 
    } 

    protected override void AddAttributesToRender(HtmlTextWriter writer) 
    { 
     base.AddAttributesToRender(writer); 

     // "myOptions" can be anything, including an empty string. 
     // You can use it for your EventArgs object if you need it. 
     PostBackOptions options = new PostBackOptions(this, "myOptions"); 

     string script = Page.ClientScript.GetPostBackEventReference(options, false); 

     writer.AddAttribute(HtmlTextWriterAttribute.Onclick, script); 
    } 

    public string Text { get; set; } 

    protected override void RenderContents(HtmlTextWriter output) 
    { 
     output.Write(Text); 
    } 
} 

Si vous souhaitez inclure une logique JavaScript supplémentaire avec votre commande, je vous suggère de lire this article sur l'inclusion JavaScript avec ASP.NET pour voir comment enregistrer des scripts avec ASP.NET.

+0

Merci. Je n'aurai pas besoin de toi pour démontrer autre chose. J'ai une idée de comment utiliser js pour mettre en évidence une ligne/cellule spécifique. Je pose cette question car j'ai besoin d'en savoir plus sur les contrôles personnalisés et les événements (si vous connaissez de bons liens, n'hésitez pas à les lister) :). – dotnetdev

+0

@dotnetdev J'ai changé ma réponse pour l'aligner sur ce que vous avez dit que vous cherchiez en fonction de votre commentaire. J'espère que c'est plus de ce que vous cherchiez. –

+0

En fait, les deux réponses étaient très utiles. Pour récapituler, le moyen le plus simple de mettre en surbrillance une ligne ou une cellule dans une grille de données est simplement d'utiliser css pur qui a les styles requis (en s'assurant que css fait partie du contrôle à travers un skin, etc.). C'est essentiellement la première méthode que vous avez fournie, n'est-ce pas? – dotnetdev

Questions connexes