У меня есть страница, на которой я динамически добавляю ImageButtons. Сначала я установил OnClientClick
кнопок, чтобы просто показать всплывающее окно с увеличенным изображением и вернуть false для отсутствия обратной передачи.
У меня есть кнопка на странице для установки «основного изображения», поэтому при нажатии этой кнопки я устанавливаю свойство с именем _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();
}
Что я делаю неправильно?