Peut sembler ne pas saisir un clic de bouton dans un gridview en asp.net
-
18-09-2019 - |
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.
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.