2010-01-18 2 views
1

У меня есть фрагмент кода, как показано ниже, и я хочу добавить кнопки изображения в мою панель asp: Panel во время загрузки страницы. Но события запускаются, когда я запускаю страницу. Я хочу, чтобы его уволили, когда он щелкнул.Добавление ImageButton Programmatically

Заранее спасибо за все помогает

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

ответ

0

Вы должны добавить элементы управления в случае Page Init, как и другие говорили.

Обработчик события изображения изображения не соответствует сигнатуре обработчика события ImageButton Click. Это должно выглядеть примерно так:

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

} 

Обратите внимание, что вы не можете передать свой «подарок» объект непосредственно к ImageButton_Click.Вам нужно будет найти другой способ сделать это.

1

Добавление элементов управления в вашем Page_Init, а не в Page_Load. [1]

Кроме того, вы не делаете этого так, как должно. Рассмотрю этот код

//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 от какого-то другого вопроса, я ответил на прошлой неделе):

Все, что необходимо поддерживать между циклами страницы должны быть объявлены in Page_Init, а не Page_Load.

Вся инициализация, как добавление обработчиков событий и добавление элементов управления, должна быть добавлена ​​во время инициализации, поскольку состояние сохраняется между циклами страниц. Обращение с содержимым элементов управления и viewstate должно быть сделано в Load.

Проверьте также http://msdn.microsoft.com/en-us/library/ms178472.aspx.

Init

Воспитанный после всех элементов управления, были инициализированы и любые кожные настройки были применены. Используйте это событие , чтобы прочитать или инициализировать управление .

.

нагрузки

На странице вызывает метод OnLoad событий на странице, то рекурсивно делает же для каждого дочернего элемента управления, который не делает то же самое для каждого из его дочерних управления до тех пор, страница и все элементы управления .

Используйте метод событий OnLoad, чтобы установить свойства в элементах управления и установить соединения базы данных .

+0

Хорошо то же самое происходит, когда я перешел из Page_Load в Page_Init. Есть ли что-то не так в этой строке ib.Click + = Purchase (g); Поскольку он запускает событие щелчка, прежде чем нажимать на кнопки изображения! – Kubi

+0

проверить мое редактирование .. –

Смежные вопросы