2012-02-23 3 views
2

У меня есть страница, где я динамически добавляю ImageButtons. Я сначала установил OnClientClick кнопок, чтобы просто показать всплывающее окно увеличенного изображения и вернуть false для отсутствия обратной передачи.Динамически добавленное событие команды ImageButton не запускается до второго щелчка

У меня есть кнопка на странице, чтобы установить «основное изображение», поэтому, когда эта кнопка нажата, я устанавливаю свойство под названием _IsSettingPrimaryPhotoMode = true, вызываю функцию для воссоздания ImageButtons и при создании ImageButtons, если это свойство истинно вместо добавления OnClientClick, я подключаю CommandEventHandler, поэтому могу указать, на какую кнопку щелкнули, прочитав CommandArgument.

Проблема заключается в том, что обработчик события не запускается при первом щелчке изображения, а только на втором щелчке и после этого. Я также переместил код с Page_Load в OnInit, и я загружаю ImageButtons на каждый ответ.

Я сохраняю _IsSettingPrimaryPhotoMode до Session.

private bool _IsSettingPrimaryPhotoMode { 
    get { 
     bool result = false; 

     if(Session[ConstantsWeb.Session.IS_DELETE_IMAGE_MODE] != null) { 
      result = Convert.ToBoolean(Session[ConstantsWeb.Session.IS_SETTING_PRIMARY_IMAGE_MODE]); 
     } 

     return result; 
    } 
    set { 
     Session[ConstantsWeb.Session.IS_SETTING_PRIMARY_IMAGE_MODE] = value; 
    } 
} 

страница OnInit

protected override void OnInit(EventArgs e) { 
    base.OnInit(e); 

     if(!IsPostBack) { 
      _IsSettingPrimaryPhotoMode = false; 
     } 

     _LoadGalleryImages(); 
    } 
} 

Метод _LoadGalleryImages

private void _LoadGalleryImages() { 
    PhotoGalleryImageCollection images = PhotoGalleryImages.GetPhotoGalleryImages(); 

    foreach(PhotoGalleryImage image in images) { 
     ImageButton displayImage = new ImageButton(); 
     Panel panel = new Panel(); 
     panelPhotoContainer.Controls.Add(panel); 
     displayImage.ImageUrl = "some URL"; 

     if(!_IsSettingPrimaryPhotoMode) { 
      displayImage.OnClientClick = "showPopup(); return false;"; 
     } 
     else { 
      displayImage.Command += new CommandEventHandler(displayImage_Command); 
      displayImage.CommandName = "ImageButton" + image.PhotoGalleryImageId.ToString(); 
      displayImage.CommandArgument = image.PhotoGalleryImageId.ToString(); 
     } 

     panel.Controls.Add(displayImage); 
    } 
} 

btnSetPrimaryPhoto_Click

protected void btnSetPrimaryPhoto_Click(object sender, EventArgs e) { 
    // if I don't call this, duplicate controls will be added since they were added 
    // from OnInit calling _LoadGalleryImages(); 
    panelPhotoContainer.Controls.Clear(); 
    _IsSettingPrimaryPhotoMode = true; 
    // reload since _IsSettingPrimaryPhotoMode has now changed 
    _LoadGalleryImages(); 
} 

Что я делаю неправильно?

+0

Попробуйте также добавить этот код и посмотреть, будет ли он исправлять вашу проблему displayImage.Command - = new CommandEventHandler (displayImage_Command); – MethodMan

+0

Почему вы вызываете _LoadGalleryImages() при нажатии кнопки и другом событии? –

ответ

1

@swannee
На самом деле, ваш метод сделал работу после того, как я думал об этом. Теперь я вызываю _LoadGalleryImages на каждом OnInit. Я понимаю, что это много дублирующегося кода, который можно было бы консолидировать.

Новые _LoadGalleryImages

private void _LoadGalleryImages() { 
    PhotoGalleryImageCollection images = PhotoGalleryImages.GetPhotoGalleryImages(); 

    foreach(PhotoGalleryImage image in images) { 
     Panel panel = new Panel(); 
     panelPhotoContainer.Controls.Add(panel); 

     ImageButton displayImage = new ImageButton(); 
     panel.Controls.Add(displayImage); 
     displayImage.ID = string.Format("ImageButton{0}", image.PhotoGalleryImageId); 
     displayImage.ImageUrl = "Some URL"; 
     displayImage.AlternateText = displayImage.ToolTip = image.ImageName; 

     if(!_IsSettingPrimaryPhotoMode) { 
      displayImage.OnClientClick = "showPopup(); return false;"; 
     } 
     else { 
      // handles the image button command wireup 
      displayImage.Command += new CommandEventHandler(displayImage_Command); 
      displayImage.CommandArgument = image.PhotoGalleryImageId.ToString(); 
     } 
    } 
} 



Я добавил новый метод, как Вы предложили, чтобы найти элементы управления, так как они уже были созданы в OnInit и мне просто нужно найти их после того, как кнопка щелкните и очистите OnClientClick.

private void _LoadSelectPrimaryImages() { 
    PhotoGalleryImageCollection images = PhotoGalleryImages.GetPhotoGalleryImages(); 

    foreach(PhotoGalleryImage image in images) { 
     Control control = panelPhotoContainer.FindControl(string.Format("ImageButton{0}", image.PhotoGalleryImageId)); 

     if(control != null) { 
      ImageButton displayImage = (ImageButton)control; 
      displayImage.OnClientClick = ""; 
     } 
    } 
} 



У меня также есть кнопка отмены, чтобы вернуть изображение кнопки к тому, как они были до того, чтобы показать всплывающее окно.

private void _ResetGalleryImages() { 
    PhotoGalleryImageCollection images = PhotoGalleryImages.GetPhotoGalleryImages(_photoGalleryId, false, true); 

    foreach(PhotoGalleryImage image in images) { 
     Control control = panelPhotoContainer.FindControl(string.Format("ImageButton{0}", image.PhotoGalleryImageId)); 

     if(control != null) { 
      ImageButton displayImage = (ImageButton)control; 
      displayImage.ImageUrl = "Original URL"; 
      displayImage.OnClientClick = "showPopup(); return false;"; 
     } 
    } 
} 



и две кнопки страницы щелкает

protected void btnSetPrimaryPhoto_Click(object sender, EventArgs e) { 
    _IsSettingPrimaryPhotoMode = true; 
    _LoadSelectPrimaryImages(); 
} 



protected void btnCancelSetPrimaryPhoto_Click(object sender, EventArgs e) { 
    _IsSettingPrimaryPhotoMode = false; 
    _ResetGalleryImages(); 
} 



Кто-то сказал в ответ раньше ... Похоже, ответ был удален ... чтобы очистить элементы управления в _LoadGalleryImages, таких как:

private void _LoadGalleryImages() { 
    panelPhotoContainer.Controls.Clear(); 
    PhotoGalleryImageCollection images = PhotoGalleryImages.GetPhotoGalleryImages(); 

    foreach(PhotoGalleryImage image in images) { 
     ImageButton displayImage = new ImageButton(); 
     Panel panel = new Panel(); 
     panelPhotoContainer.Controls.Add(panel); 
     displayImage.ImageUrl = "some URL"; 

     if(!_IsSettingPrimaryPhotoMode) { 
      displayImage.OnClientClick = "showPopup(); return false;"; 
     } 
     else { 
      displayImage.Command += new CommandEventHandler(displayImage_Command); 
      displayImage.CommandName = "ImageButton" + image.PhotoGalleryImageId.ToString(); 
      displayImage.CommandArgument = image.PhotoGalleryImageId.ToString(); 
     } 

     panel.Controls.Add(displayImage); 
    } 
} 



, который также работает, но я думаю, который может быть более неэффективным, чем ваш метод, @swannee. Благодаря!

3

Это должно быть что-то, связанное с первоначальным подключением к событию, потому что проблема возникает только в первый раз. В то же время, что _LoadGalleryImages вызывается дважды (один раз в init и один раз в обработчике событий нажатия кнопки), поэтому я думаю, что что-то не очищается там, когда вы очищаете панель контейнера и вызываете _LoadGalleryImages снова нажатием кнопки обработчик.

Почему бы не попробовать эту альтернативу: Только вызовите LoadImageGalleries один раз на странице (в init).

Вместо того, чтобы очищать элементы управления и вызывать LoadGalleryImages снова в том же обратном направлении (в событии нажатия кнопки), на кнопке щелкните метод вызова, который выполняет итерации с помощью элементов управления изображением, которые вы уже создали при вызове LoadGalleryImages и скорректировали их:

1) Снимите onclientclick (очистите его).

2) Прикрепите мероприятие.

+0

Я не думаю, что это сработает, так как элементы управления добавляются динамически. Я попытался выполнить итерацию с помощью элементов управления страницы, и они не существуют, поскольку они добавлены в if (! IsPostBack) {} в OnInit, но они не находятся после нажатия кнопки страницы. Я думаю, что необходимо всегда вызывать _LoadGalleryImages в OnInit, поэтому состояние DOM и страницы будет одинаковым каждый раз. Проблема была в том, что я не добавлял идентификаторы в элементы управления. –

+0

Не уверен, что вы поняли мой ответ, я не имел в виду только один раз его называть ... Я имел в виду только его однократно на странице цикла (в init). Но до тех пор, как исправить работу .... Отлично! – swannee

+0

Я понимаю, что вы сейчас имеете в виду. См. Мое решение в ответе. –

2

Я полагаю, проблема может быть вызвана тем фактом, что вы не установили ID с динамически созданных элементов управления. Это очень важно, поскольку он используется в процессе обстрела событий после назад. Значение ID для каждого элемента управления должно быть постоянным и не изменять между обратными передачами.

Вы можете попытаться изменить ваш метод _LoadGalleryImages() так:

private void _LoadGalleryImages() { 
    PhotoGalleryImageCollection images = PhotoGalleryImages.GetPhotoGalleryImages(); 

    int imageCtrlCounter = 0; 
    foreach(PhotoGalleryImage image in images) { 
     ImageButton displayImage = new ImageButton() { ID = String.Format("myDisplayImage{0}", imageCtrlCounter) }; 
     Panel panel = new Panel(); 
     panelPhotoContainer.Controls.Add(panel); 
     displayImage.ImageUrl = "some URL"; 

     if(!_IsSettingPrimaryPhotoMode) { 
      displayImage.OnClientClick = "showPopup(); return false;"; 
     } 
     else { 
      displayImage.Command += new CommandEventHandler(displayImage_Command); 
      displayImage.CommandName = "ImageButton" + image.PhotoGalleryImageId.ToString(); 
      displayImage.CommandArgument = image.PhotoGalleryImageId.ToString(); 
     } 

     panel.Controls.Add(displayImage); 
     imageCtrlCounter++; 
    } 
} 
+0

Не задавали идентификаторы. –

+0

Ну, это было частью проблемы, но решение @swannee было полным ответом, поэтому я отметил его ответ, но нажал, что ваш был полезен. –

+0

О, я вижу, я не вижу никаких ответов на мой ответ (однако может быть какая-то задержка). Во всяком случае, хорошо, что вы исправили это :). –

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