2010-01-18 9 views
1

J'ai un extrait de code comme ci-dessous et je veux ajouter des boutons image dans mon asp: Panel pendant le chargement de la page. Mais les événements déclenchent déjà quand je cours la page. Je veux qu'il soit déclenché quand il est cliqué.Ajout de ImageButton par programme

Merci à l'avance pour tous les aide

protected void Page_Load(object sender, EventArgs e) 
    {... 

     foreach (Gift g in bonusGifts) 
     { 
      ImageButton ib = new ImageButton(); 
      ib.ImageUrl = g.GiftBanner; 
      ib.ID = g.GiftID.ToString(); 
      ib.Click += Purchase(g); 
      BonusGiftPanel.Controls.Add(ib); 

     } 
    } 

    private ImageClickEventHandler Purchase(Gift g) 
    { 
     _giftRep.Purchase(g, _userSession.CurrentUser); 
     lblGifts.Text = "You have purcased " + g.GiftName + " for " + g.BonusPoints; 

     return null; 
    } 

Répondre

0

Vous devez ajouter les contrôles en cas Init page, comme d'autres l'ont dit.

Votre gestionnaire d'événements de clic d'image n'est pas conforme à la signature du gestionnaire d'événements ImageButton Click. Cela devrait ressembler à ceci:

private void ImageButton_Click(ByVal sender As Object, ByVal e As ImageClickEventArgs) 
{ 

} 

Notez que vous ne pouvez pas passer votre objet « cadeau » directement au ImageButton_Click.Vous devrez trouver une autre méthode pour le faire.

1

Ajouter des contrôles dans votre Page_Init, pas dans votre Page_Load. [1]

En outre, vous ne le faites pas comme il se doit. Considérez ce code

//your collection of objects goes here. It might be something different than 
//this, but basically a Dictionary<int, YourType> goes fine 
public Dictionary<Int32, string> Ids 
{ 
    get { return (ViewState["ids"] ?? new Dictionary<Int32, string>()) as Dictionary<Int32, string>; } 
    set { ViewState["ids"] = new Dictionary<Int32, string>(); } 
} 

protected void Page_Init(object sender, EventArgs e) 
{ 
    //load the data using your DAO 
    Ids = new Dictionary<int, string>(); 

    Ids.Add(1, "http://www.huddletogether.com/projects/lightbox2/images/image-2.jpg"); 
    Ids.Add(2, "http://helios.gsfc.nasa.gov/image_euv_press.jpg"); 

    foreach (var item in Ids) 
    { 
     ImageButton imb = new ImageButton() 
     { 
      ImageUrl = item.Value, 
      CommandArgument = item.Key.ToString(), 
      CommandName = "open" 
     }; 

     imb.Click += new ImageClickEventHandler(imb_Click); 

     PH1.Controls.Add(imb); 
    } 
} 

void imb_Click(object sender, ImageClickEventArgs e) 
{ 
    Response.Write("You purchased " + Ids[int.Parse(((ImageButton)sender).CommandArgument)]); 
} 

[1] (CTRL + C/CTRL + V d'une autre question que je répondu la semaine dernière):

Tout ce qui doit être maintenu entre les cycles de page devraient être déclarés dans Page_Init, et non Page_Load.

Toutes les initialisations, comme l'ajout de gestionnaires d'événements et l'ajout de contrôles, doivent être ajoutées lors de l'initialisation, car l'état est enregistré entre les cycles de page. La gestion du contenu des contrôles et de viewstate doit se faire au Load.

Cochez également http://msdn.microsoft.com/en-us/library/ms178472.aspx.

Init

Élevé après tous les contrôles ont été initialisé et tous les paramètres de la peau ont été appliquées. Utilisez cet événement pour lire ou initialiser les propriétés de contrôle .

.

Charge

La page appelle la méthode d'événement OnLoad sur la page, puis fait récursive le même pour chaque contrôle enfant, qui fait la même chose pour chacun de ses enfants contrôles jusqu'à ce que la page et tous les contrôles sont chargés.

Utilisez la méthode d'événement OnLoad pour définir les propriétés dans les contrôles et établir les connexions de base de données .

+0

bien la même chose arrive quand je suis passé de Page_Load à Page_Init. Y at-il un problème avec cette ligne? ib.Click + = Purchase (g); Parce qu'il déclenche l'événement click avant de cliquer sur les boutons image! – Kubi

+0

vérifier mon édition .. –

Questions connexes