2009-09-28 7 views
0

J'ai placé des boutons Image dans ma grille, mais je n'arrive pas à capturer l'événement click. Ni créer un événement de clic, ni créer un gestionnaire OnRowCommand dans la grille fonctionne.Impossible de capturer un clic sur un bouton dans un gridview dans asp.net

Cliquer simplement sur les boutons pour revenir à la page en cours.

ajouter mes boutons comme ceci:

protected void gridview1_RowDataBound(object sender, GridViewRowEventArgs e) 
{ 
    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 
     string status = DataBinder.Eval(e.Row.DataItem, "visitstatusuid").ToString(); 

     string visitUID = DataBinder.Eval(e.Row.DataItem, "visituid").ToString(); 

     Color backColor = Color.White; 
     Color foreColor = Color.Black; 

     ImageButton b; 

     switch (status) 
     { 
      case "U": // Unallocated 
       backColor = ColorTranslator.FromHtml("#B2A1C7"); 
       b = new ImageButton(); 
       b.Width = Unit.Pixel(25); 
       b.Height = Unit.Pixel(30); 
       b.AlternateText = "Book"; 
       b.ImageUrl = "../../Images/New/booking.gif"; 
       b.ToolTip = "Booking"; 
       b.CommandName = "Booking"; 
       b.CommandArgument = visitUID; 
       b.CausesValidation = false; 

       e.Row.Cells[(e.Row.Cells.Count - 3)].Controls.Add(b); 

etc.

Répondre

0

Vous devrez joindre le gestionnaire lorsque le bouton est créé:

b.Click += MyButtonClickEventHandler; 

Modifier:
au lieu de créer le bouton dans le gestionnaire OnRowDataBound, utilisez OnRowCreated.
Cela garantit que le bouton est recréé sur les publications.

Exemple:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) { 
    BindData(); 
    } 
} 

protected void BindData() 
{ 
    // Do your databinding here. 
} 

protected void MyGridView_RowCreated(object sender, GridViewRowEventArgs e) 
{ 
    var b = new ImageButton(); 
    b.AlternateText = "Click Me!"; 
    // Etc. 

    b.Click += MyButton_Click; 
    // Add the button to the column you want. 
} 

protected void MyButton_Click(object sender, ImageClickEventArgs e) 
{ 
    // Do your thing... 
} 
+0

En effet, j'ai essayé b.Click + = new ImageClickEventHandler (gridviewButtonClick), et le point de coupure, mais le point d'arrêt ne frappe pas lorsque je clique sur le bouton – NibblyPig

+0

Lorsque vous cliquez sur le bouton, une publication se produit Recréez-vous le bouton sur la publication? –

0

Sauf si vous ajoutez un gestionnaire d'événements ailleurs, vous devrez mettre AutoEventWireup="true" dans la directive page de votre fichier ASPX.

Cela dit, je préfère explicitement les événements de câblage donc plutôt que d'utiliser AutoEventWireup ajouter cette ligne à votre méthode OnInit:

gridview1.RowDataBound += this.gridview1_RowDataBound; 
+0

Il est déjà mis à vrai :( – NibblyPig

+0

Je crains que cela ne fonctionne pas non plus :( – NibblyPig

0

Pour votre approche à l'aide RowDataBound au travail, vous devez lier de nouveau la grille sur chaque chargement de page, et assurez-vous le faire au plus tard OnLoad du cycle de vie, afin l'événement click à enregistrer à temps.

Une autre approche que j'ai eu avec succès consiste à créer une nouvelle méthode pour effectuer la configuration du bouton DataGrid, par ex.

void PerformConditionalGridFormatting() 
{ 
    foreach (GridViewRow row in gvCaseList.Rows) 
    { 
     if (row.RowType == DataControlRowType.DataRow) 
     { 
      ... Add your buttons to the cells here 
     } 
    } 
} 

Ensuite, vous appelez la méthode à chaque fois que vous effectuez un DataBind manuel, ainsi que sur tous les postback-à-dire dans votre gestionnaire de OnLoad faire:

if (Page.IsPostBack) PerformConditionalGridFormatting(); 

L'avantage de cette approche est que vous n'avez pas avoir à documenter chaque publication, ce qui économise des ressources.

0

créer un gestionnaire d'événements RowCommand pour le gridview et vérifiez le nom de la commande pour voir si elle est le bouton déclenchant

quelque chose à l'effet de

void gridview1_RowCommand(object sender, args e) 
{ 

if (e.CommandName == "Booking") 
{ 
// call your desired method here 
} 

} 
0

Mettre l'événement de liaison de la grille pour ne pas poster.