Question

Je mets quelques boutons d'image dans mon gridview, mais je ne peux pas capturer l'événement de clic. Ni la création d'un événement de clic, ni la création d'un gestionnaire OnRowCommand dans les travaux gridview.

En cliquant sur les boutons postbacks simplement à 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.

Était-ce utile?

La solution

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éée sur postbacks.

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...
}

Autres conseils

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 le câblage explicitement les événements de manière plutôt que d'utiliser AutoEventWireup ajouter cette ligne à votre méthode de OnInit:

gridview1.RowDataBound += this.gridview1_RowDataBound;

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, pour que l'événement click être enregistré dans le temps.

Une autre approche que j'ai eu du succès avec est de créer une nouvelle méthode pour faire la configuration du bouton DataGrid, par exemple

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 à DataBind sur chaque postback, ce qui permet d'économiser les ressources.

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
}

}

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top