2016-12-03 16 views
0

У меня возникли проблемы с добавлением события в ImageButton. Мне нужно создать набор кнопок в зависимости от выбранной опции из DropDownList. Кнопки создаются успешно с данными базы данных, но я не могу прикрепить функциональность OnClick.Ошибка ASP.NET C# Добавление обработчика событий в ImageButton CodeBehind

Созданные кнопки должны совместно использовать один и тот же обработчик.

protected void cmbServ_SelectedIndexChanged(object sender, EventArgs e) { 
    ServiceID = cmbServ.SelectedValue.ToString(); 
    ServiceName = cmbServ.SelectedItem.ToString(); 

    DataTable dtFirstTab = new DataTable(); 
    dtFirstTab = mySQLConn.getTable(qryCarry); // LOAD DATA FROM DB 

    foreach (DataRow row in dtFirstTab.Rows) { 
    FTabBtn = "btn"+(Convert.ToInt32(row["SKU_Credito"])).ToString(); 
    FTabIconURL = row["SKU_Icon"].ToString(); 

    Panel dvFirstTab = new Panel(); 
    dvFirstTab.CssClass = "col-xs-2"; 

    ImageButton IB = new ImageButton(); 
    IB.ID = FTabBtn; 
    IB.ImageUrl = FTabIconURL; 
    IB.Click += new ImageClickEventHandler(btnX_click); // <-- PROBLEM 

    dvFirstTab.Controls.Add(IB); 
    pnlIcons.Controls.Add(dvFirstTab); // pnlIcons exists in HTML 
} 

protected void btnX_click(object sender, ImageClickEventArgs e) { 
    string Obj = ((ImageButton)sender).ClientID; 
    Cantidad = Convert.ToInt32(Obj.Substring(3, (Obj.Length) - 3)); 
    txtMonto.Text = "$" + Cantidad.ToString(); 
} 

Все кнопки отображаются правильно, но когда я нажимаю на них они просто огонь «представить» действие, действуя как нет никакой OnClick назначен.

Нет CodeBehid пример:

Если добавить эту строку в HTML (я удалил Asp теги)

ImageButton ID="btn10" runat="server" ImageUrl="MontoLogo_10ST.png" OnClick="btnX_click" 

Он делает работу по назначению.

Любые идеи? Большое спасибо!

+0

Просто скажите IB.Click + = btnX_click. Btnx_click уже является обработчиком событий, нет необходимости создавать другое. – cyanide

ответ

0

Создание элементов управления динамически в веб-форматах ASP.NET обычно кажется легким в начале, но проблемы очень распространены, когда дело касается обработки событий. Даже если вы правильно назначили обработчик событий, обработчик событий не запускается в обратном направлении, пока вы не заново создадите все динамические элементы управления на раннем этапе жизненного цикла страницы. Это объясняет, почему образец с ImageButton на ASPX работает, тогда как динамически созданные кнопки этого не делают.

Дополнительную информацию о создании элементов управления см. Здесь page. Самая важная часть - предупреждение, которое в основном говорит: , если вам нужно добавить динамические элементы управления, лучше не делать этого.

Обычно вы можете найти способ создания всех необходимых элементов управления в разметке, например, с помощью элемента управления Repeater. Большим преимуществом ретранслятора является то, что у вас есть контроль над созданной разметкой.

В следующем примере описываются необходимые шаги:

  1. Поместите повторитель на вашем ASPX-странице. Если pnlIcons не служит никакой другой цели, кроме как контейнер для динамически создаваемых кнопок, замените его повторителем. Используйте свойства Header и FooterTemplate, чтобы добавить разметку, которая окружает ImageButtons (например, div для dvFirstTab).
  2. Подумайте, какие данные вам нужно назначить кнопке изображения. В вашем случае необходимы поля «SKU_Credito» и «SKU_Icon».
  3. Поместите кнопку изображения в ItemTemplate ретранслятора и привяжите свойства «Id» и «ImageUrl» к соответствующим полям.
  4. Добавьте обработчик события Command и привяжите свойство CommandArgument к значению, которое поможет вам различать кнопки изображения.
  5. В обработчике события команды вы можете использовать CommandArgument, чтобы узнать, какая кнопка была нажата. Добавьте соответствующий код, который обрабатывает команду.
  6. В обработчике событий SelectedIndexChanged прочитайте данные из базы данных и привяжите ретранслятор к результату. Это создает строки в репитере с помощью ImageButtons.
0

Хорошо, я нашел причину.Обработка событий должна быть назначена в событии Page_Load, поэтому я переместил все внутри метода и вызвал его из Page_Load, вызвав его из «SelectedIndexChanged», не работает. Теперь работает.

Спасибо!

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

  • Нет связанных вопросов^_^