我有一个要动态添加 ImageButton 的页面。我首先将按钮的 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();
}
我做错了什么?
最佳答案
我想这个问题可能是由于您没有设置动态创建的控件的 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++;
}
}
关于c# - 动态添加的 ImageButton 命令事件直到第二次单击才触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418129/