c# - 动态添加的 ImageButton 命令事件直到第二次单击才触发

标签 c# asp.net .net page-lifecycle

我有一个要动态添加 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/

相关文章:

.NET 日期时间选择器平面样式

c# - FullCalendar,如何允许用户编辑/删除事件并将其从数据库中删除?

c# - System.Web.HttpUtility.HtmlDecode 给出不同的结果

asp.net - 从 Web 应用程序生成 XPS 文档

c# - SynchronizationContext 可以不在 WinForms/WPF 应用程序中使用吗?

.net - AppDomain.UnhandledException 事件如何工作?

c# - 带身份验证的 WCF 流

c# - 托管代码中是否可能发生内存泄漏? (特别是 C# 3.0)

c# - 绑定(bind)到 DataGridView,因此每个单元格都是绑定(bind)对象而不是每一行

c# - 列表框鼠标悬停以显示列表项文本