Добавление ImageButton программно - PullRequest
1 голос
/ 18 января 2010

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

Заранее спасибо за помощь

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

Ответы [ 3 ]

1 голос
/ 18 января 2010

Добавьте элементы управления в 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 из другого вопроса, на который я ответил на прошлой неделе):

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

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

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

Init

Повышается после инициализации всех элементов управления и любого скина Настройки были применены. Использовать этот событие для чтения или инициализации управления свойства.

.

Load

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

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

0 голосов
/ 18 января 2010

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

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

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

}

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

0 голосов
/ 18 января 2010

Вам нужно взглянуть на жизненный цикл страницы - http://msdn.microsoft.com/en-us/library/ms178472.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...