2009-02-27 7 views
0

J'ai un événement _Click qui se déclenche quand un graphique est cliqué sur. Dans cet événement, j'ai immédiatement cast l'expéditeur pour taper Chart. Je suis souvent ce paradigme mais je me sens bizarre chaque fois que je le fais.C# _Click Event Casting Expéditeur et à l'aide FindControl

Dans cette instance particulière, je suis également à court de ressources pour trouver un UpdatePanel correspondant afin que je puisse y ajouter un GridView rendu dynamiquement. Chart et UpdatePanel sont bricolés en ayant des ID similaires. Le graphique et le panneau de mise à jour sont créés dynamiquement au moment de l'exécution.

Je me demande s'il existe une meilleure façon de mettre en œuvre ce type de comportement.

protected void Chart_Click(object sender, ImageMapEventArgs e) 
{ 
    Chart chart = (Chart)sender; 
    UpdatePanel up = (UpdatePanel)chart.Parent.FindControl(chart.ID + "UP"); 

    GridView gv = new GridView(); 
    Dictionary<string, string> displayFields = 
     new Dictionary<string, string>(); 

    // add data to displayFields by using the ImageMapEventArgs.PostBackValue 
    // to create data for dictionary ... 

    gv.DataSource = displayFields; 
    gv.DataBind(); 
    up.ContentTemplateContainer.Controls.Add(gv); 
} 
+0

Il n'y a rien de mal avec l'expéditeur de coulée Si vous en avez besoin, c'est ce qu'il vous faut. –

Répondre

3

Je ne suis pas sûr de ce que d'autre peut être fait à la coulée expéditeur à un graphique (autre que l'utilisation as), mais il y a plusieurs façons de régler le problème de leurs commandes.

  • Ajouter une propriété au graphique appelé « LinkedPanel » et assignez votre panneau de mise à jour il

    Vous verrez un modèle similaire utilisé dans une icône de notification, où vous associate it with a context menu)

    Je pense que c'est particulièrement agréable, parce que quand c'est bien fait, vous pouvez simplement assigner le contrôle lié dans le concepteur de formulaire. (Bien sûr, il ne va pas aider avec vos commandes générées dynamiquement)

  • combiner les deux commandes en une seule UserControl (si les contrôles montrent toujours juste à côté de l'autre, cela pourrait être la bonne chose à faire)

  • Créer un objet qui connaît les contrôles, et l'ont gérer les événements qu'ils soulèvent

Je suis d'accord que, selon le nom se sent mal; Je serais trop embarassé/nerveux pour l'utiliser dans le code de production: -/(Si vous êtes le seul développeur, alors je suppose que c'est à vous de décider ...En utilisant ces autres approches, il est moins probable qu'une "modification innocente" faite par un autre développeur commence à provoquer des exceptions inattendues.

+0

L'ajout d'une propriété au graphique suppose que ce n'est pas une classe scellée bien sûr. –

+0

@lc: Oui, j'espère que ce n'est pas le cas ... mais si c'est le cas, il y a d'autres routes qui peuvent être empruntées. –

+0

Oui. Ajoutant la propriété est certainement le moyen le plus propre à aller. –

1

Je pense qu'il est sûr de jeter à l'expéditeur Chart parce que vous savez qu'il est toujours un Chart. Notez que le nom de la méthode est pair Chart_Click. Toutefois, vous pouvez enregistrer une référence au UpdatePanel dans la propriété Tag de Chart. Cela économise la laideur et le risque d'une recherche de noms dans le parent. Cela pourrait être difficile à maintenir si vous changez constamment de parents ou déplacez des panneaux.

Si vous connaissez 100% les UpdatePanel « s va être là et nommé correctement, cependant, il n'y a rien nécessairement « mal » avec votre approche à mon humble avis. Vous pouvez ajouter un commentaire "ne pas modifier ce nom" à côté de la ligne UpdatePanel.Name = où vous l'initialisez pour des raisons de sécurité. (BTW, si vous n'êtes pas le seul à avoir accès à votre code, le 100% tombe instantanément au plus à 99,9%.)

1

Utilisez comme à la place.

Votre distribution lancera si elle échoue.

Chart chart = sender as Chart; 
if (chart == null) 
    return; // or do something else 

// the rest of your handler. 
+0

Je pense que lancer est la bonne réponse. Dans mon livre, personne, sauf un graphique, ne devrait appeler Chart_Click. En utilisant comme ajoute des frais supplémentaires inutiles et la vérification. –

+0

lancer dans un gestionnaire d'événements entraînera une exception non gérée. –

0

Il n'y a rien de vraiment faux dans ce que vous avez fait. Mais vous pouvez empêcher l'erreur de typage en utilisant 'comme' la distribution explicite comme suit.

si vous voulez trouver si le contrôle est un UpdatePanel vous pouvez le faire en utilisant GetType() méthode

exemple: sender.GetType().name vous donnera le nom du contrôle

protected void Chart_Click(object sender, ImageMapEventArgs e) 
{ 
    Chart chart = (Chart)sender; 
    control c = Parent.FindControl(chart.ID + "UP"); 
    UpdatePanel up ; 

    if (c != null) 
    { 
     up = c as UpdatePanel;** 


     GridView gv = new GridView(); 
     Dictionary<string, string> displayFields = 
      new Dictionary<string, string>(); 

     // add data to displayFields by using the ImageMapEventArgs.PostBackValue 
     // to create data for dictionary ... 

     gv.DataSource = displayFields; 
     gv.DataBind(); 
     up.ContentTemplateContainer.Controls.Add(gv); 
    } 
}