Ajouter dynamiquement un bouton de commande pour un contrôle GridView
Je vais avoir un problème avec la tentative d'ajout d'un bouton de ma grille. Mon GridView est chargée pour la première fois avec les données de l'événement PageLoad.
Je suis ensuite prendre les données dans la première cellule de chaque ligne, et de créer un bouton qui permettra de lien vers une URL. Pour obtenir l'URL, j'ai exécuter une requête avec les données de la première cellule en tant que paramètre. Je faisais ça dans le RowDataBound cas au premier abord, mais en appuyant sur cette requête pour chaque ligne le faisait vraiment lent.
J'ai donc décidé d'ajouter un bouton qui permettrait de récupérer l'URL que lorsque vous avez cliqué sur le bouton.
Voici mon GridView:
<asp:GridView ID="gvResults" runat="server"
OnRowDataBound="gvResults_RowDataBound"
OnRowCommand="gvResults_RowCommand">
</asp:GridView>
Et mon code:
protected void gvResults_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.DataItem != null)
{
LinkButton lb = new LinkButton();
lb.CommandArgument = e.Row.Cells[0].Text;
lb.CommandName = "NumClick";
lb.Text = e.Row.Cells[0].Text;
e.Row.Cells[0].Controls.Add((Control)lb);
}
}
protected void gvResults_RowCommand(object sender, CommandEventArgs e)
{
switch (e.CommandName.ToLower())
{
case "numclick":
string url = GetUrl(e.CommandArgument.ToString());
Response.Redirect(url);
break;
default:
break;
}
}
La grille génère fine, le bouton est ajouté à la grille pour chaque ligne. Mais quand je clique dessus, la RowCommand événement n'est pas déclenché, et la page se rafraîchit.
Personne ne sait ce qu'est la question?
OriginalL'auteur Steven | 2011-01-19
Vous devez vous connecter pour publier un commentaire.
Pourquoi utiliser un bouton dynamique? Vous pouvez facilement mettre la linkbutton directement dans le balisage de la gridview (tant que vous n'avez pas l'esprit à l'aide d'un modèle de champ) et il n'y aura pas besoin de se compliquer la vie avec la RowDataBound événement.
Votre balisage ressemblerait à quelque chose comme ce qui suit:
Ajouter des points d'arrêt à la RowCommand de l'événement et assurez-vous que vous pouvez atteindre les points d'arrêt.
Le problème peut se situer ailleurs.
Aussi, assurez-vous que vous n'êtes pas la liaison de données sur la publication.
TemplateField travaillé, merci.
Génial. Il est toujours préférable d'essayer et d'utiliser le balisage autant que possible. Si quelque chose peut être déplacé hors de votre code de marquage, puis aller pour elle.
si j'ai l'affichage de la grille qui est rempli dynamiquement.. alors je ne peut pas déclarer les champs dans le balisage car la pas de.des colonnes peut changer à chaque fois. alors, comment devrions-nous aller à ce sujet..
OriginalL'auteur NakedBrunch
Vous avez un gros problème avec votre code. Il est assez difficile pour moi d'expliquer ce qu'est votre grosse erreur, mais je peux facilement vous dire comment le réparer.
Le problème, c'est que vous générez un nouveau bouton à l'intérieur de la
RowDataBound
cas, certainement le wrongest choix. Le bouton est rendu parce qu'il existe après cet événement, lorsque la page s'affiche, mais n'existe pas avant de liaison de données. Si vous liez des données chaque fois que vous chargez la page (même en cours de publication), le bouton devient encore rendu parce que vous générez un nouveau bouton.Mais depuis que le bouton n'existe pas avant de liaison de données, il est impossible de déclencher des événements. Vous doit déclarer le bouton à partir de la majoration dans un modèle de contrôle GridView, puis y accéder non pas à l'aide de nouvelles
LinkButton()
mais en utilisante.Row.Cells[0].FindControl("buttonId")
et l'ensemble de son texte. Ensuite, vous devez définir sa balisage afin d'incendie son propreCommand
événement (pasRowCommand
) et de les traiter comme vous l'avez utilisé (ne pas oublier de réglerCommandArgument
lors de la liaison de données)[Edit] j'ai aussi fait une erreur: les contrôles à l'intérieur des données des contrôles liés ne sont pas aussi existent avant de liaison de données. Mais ils sont initialisés pas avec
new Control()
(par les méthodes privées de contrôle lié aux données), mais avecPage.LoadControl(typeof(Control))
. C'est la première chose que vous devez corriger lorsque vous chargez des contrôles dynamiquement!!OriginalL'auteur usr-local-ΕΨΗΕΛΩΝ
Parce que le contrôle est ajouté dynamiquement sur databind et vous devez databind le contrôle gridview pour chaque publication, le contrôle en cours "cliqué" est différente à chaque fois. L'événement n'a pas le feu, car à l'époque il a besoin d'incendie, il n'existe pas, comme il l'a fait dans la dernière itération de la page.
J'ai remarqué que vous n'avez pas toute la logique de déterminer si le bouton doit être là, et il en va toujours ainsi dans la cellule[0].
Vous devez placer ce bouton dans un TemplateItem de sorte qu'il existe correctement. Si vous avez besoin de faire dans le code-behind, vous êtes probablement mieux servi à le faire dans le RowCreated événement.
OriginalL'auteur Joel Etherton