2009-03-09 6 views
1

J'ai une page ASPX qui a un contrôle qui sert de résumé pour un GridView qui est sur la même page. Lorsque la page se charge, elle crée le contrôle récapitulatif et crée dynamiquement des liens et y attache un gestionnaire d'événements. Voici un extrait:Vous devez cliquer deux fois sur le lien créé dynamiquement sur le contrôle avant de faire quoi que ce soit?

protected void Page_Load(object sender, EventArgs e) 
{ 
    LoadSummaries();  
} 

LoadSummaries() boucle dans le DataSet pour le GridView et crée les liens. Voici un extrait de la façon dont je suis en train de créer les liens et la fixation et gestionnaire d'événements pour les:

LinkButton lb = new LinkButton(); 
lb.Text = "Dynamic Text goes here"; 
lb.Click += new System.EventHandler(this.Search); 
lb.CommandName = "CommandName"; 
lb.CommandArgument = "CommandArgument"; 

Quand je lance la page, il charge tout va bien, mais je dois cliquer sur le lien deux fois pour elle d'aller dans Méthode de recherche Au premier clic, la page se recharge, mais elle ne va pas dans la méthode de recherche. Au second clic, il va dans la méthode de recherche. J'étais curieux de savoir si c'était parce que, au premier clic, il lie réellement le gestionnaire d'événements au linkbutton, mais cela se passe dans Page_Load, donc quand la page est chargée, LoadSummaries est appelé, ce qui lie à son tour le événements au bouton lien, donc je suis coincé sur la compréhension de pourquoi je dois cliquer deux fois.

+0

pouvez-vous ajouter l'extrait comment vous ajoutez vos liens à la page. J'ai essayé votre code, ça marche bien. – Canavar

+0

Il est dans la question ou avez-vous besoin d'autres informations. – Xaisoft

Répondre

3

Utilisez-vous des contrôles complexes ailleurs sur la page qui peuvent être injectait contrôles dans votre page?

J'ai eu ce problème avec les pages qui ont certains contrôles des bibliothèques qui injectent des contrôles dans la page. J'utilise un contrôle de calendrier qui le fait. Ce qui m'arrivait, c'est que lorsque les contrôles étaient générés par mon code, les ID de contrôle semblaient corrects, mais juste avant le rendu, le contrôle de la boîte à outils injectait de nouveaux contrôles, ce qui signifiait que l'URL de publication de mon lien s'identifiait avec un ID de contrôle, mais le serveur a pensé qu'il devrait avoir un ID de contrôle différent.

Cela a provoqué le gestionnaire d'événements à ne pas être adapté au contrôle au premier poteau arrière, de sorte que l'événement ne pouvait tirer. La deuxième fois, cependant, les contrôles avaient déjà été injectés, donc mon linkbutton avait le nouvel ID de contrôle dans son URL de publication, donc l'événement pouvait se déclencher.

Solution 1: Débarrassez-vous du contrôle qui injecte et provoque le problème. Malheureusement, pas toujours une option. Je ne pouvais pas faire ça dans mon cas.

Solution 2: Débarrassez-vous de LinkButton et d'utiliser un lien régulier. Peut ne pas fonctionner si votre gestionnaire d'événements DOIT être sur cette page.

Solution 3: Entrez un ID qui ne sera pas modifié par d'autres contrôles. (C'était la solution pour Xaisoft)

+0

Oui, il y a d'autres contrôles sur la page. J'ai fait specfiy un ID pour les boutons dynamiquement créés de lien et il semble fonctionner bien maintenant. Pouvez-vous donner un exemple de comment ne pas spécifier l'ID du contrôle modifie votre URL de publication? Merci. – Xaisoft

2

Jay a raison. Comme vous n'attribuez aucun ID à vos contrôles, il est probable que quelque chose change dans votre page sur la publication, ce qui signifie qu'il ne peut pas lier l'événement à un contrôle. Par ailleurs, il est théoriquement mal avisé de ne pas assigner d'ID à vos contrôles car cela rendrait inefficaces tous les tests intégrateurs de l'interface utilisateur (tels que les suites de tests basées sur le sélénium) si jamais vous modifiez votre mise en page.

+0

Comment est-ce que je pourrais voir ce qui se passe réellement quand je n'attribue pas un ID et quand je fais? Est-ce que je regarde juste la source de la page? – Xaisoft

+0

Oui. ASP.Net génère des ID de contrôle automatiquement si vous ne les spécifiez pas. Les ID générés automatiquement sont basés sur l'ordre dans lequel ils sont ajoutés à leur contrôle parent. Si vous modifiez l'ordre de création (par exemple en insérant ou en supprimant d'autres contrôles), les ID seront différents. – womp

Questions connexes