ASPX和ASCX之间的事件

3
我是一名.NET的初学者,从昨天早上开始寻找解决问题的方法,但一直没有找到答案。
这是我的问题:
我需要传递参数,所以通过以下方式动态创建了一些用户控件:
List<ANNOUNCEMENT> listAnnouncement = getAnnoucements();
foreach(ANNOUNCEMENT ann in listAnnouncement)
{
    if(ann.IS_CURRENT_ANNOUNCEMENT && currentAnnouncement == null)
    {
         currentAnnouncement = ann;
    }
    List<Object> listParams = new List<Object>();
    listParams.Add(ann);
    AnnouncementPresentation ap = (AnnouncementPresentation)(Controller.LoadControl(Page, "~/UserControls/AnnouncementPresentation.ascx", listParams.ToArray()));
    /* important for the end of the method */
    ap.modifyAnnouncementButtonClick += new EventHandler(modifyAnnouncementButtonClick);
    pnl_announcements.Controls.Add(ap);
}

在这个ASCX中,我有一个按钮,当用户点击它时,我想调用包含在我的ASPX中的一个方法,所以我在ASCX中这样做:
public event EventHandler modifyAnnouncementButtonClick;
protected void btn_modify_announcement_Click(object sender, EventArgs e)
{
    PageAdminAnnonces.currentAnnouncement = annonce;
    modifyAnnouncementButtonClick(sender, e);
}

在ASPX中的内容如下:
protected void modifyAnnouncementButtonClick(object sender, EventArgs e)
{
     initListOfAnnouncement();
     lbl_errors.Text = currentAnnouncement.TITLE;
}

我认为一切都运行正常,但是存在一个问题:它只能运行一次,在方法结束时,我删除了我的ASCX,如您所见,并创建了新的ASCX。但是它们没有这些方法,当我再次单击时,什么都不起作用,所以ASPX被重新加载。重新加载后,它又可以正常工作。

我做错了什么吗?


看起来你是在 initListOfAnnouncement 方法中添加动态创建的控件,这有点晚了。我建议你在 Page_InitPage_Load 方法中添加所有需要的控件。 - Lukasz M
我正在Page_Load中添加这些控件,我的initListOfAnnouncement()方法在Page_Load中被调用。问题是,当我有一个点击事件时,我需要更改我的用户控件(例如将其中一个文本加粗),但不要加载整个页面,因为如果我这样做,我会丢失所有参数,并且失去哪个用户控件应该加粗的信息。我不知道我的解释是否足够清楚。 - bbusseuil
1
我仍然建议您在Page_Load中创建控件,而不是在单击处理事件中删除/重新创建它们,但只在那里设置现有控件的属性。如果您需要在Page_Load中使用一些额外的参数,我想您可以通过将它们作为查询字符串传递给页面来传递一些额外的参数,例如使用Button.PostBackUrl属性。 - Lukasz M
1
有几种方法可以实现这个:你可以在 Page_Load 中创建时保存对那些控件的引用,然后在点击处理方法中使用它们;或者你可以通过 FindControl() 方法访问它们。无论哪种方式,你都应该为你动态创建的每个控件分配唯一的 ID,这样你就可以使用 FindControl() 找到它,并允许 asp.net 正确地处理它们的视图状态(这可能是必要的)。 - Lukasz M
1
嗯,好的。我本来觉得这不是一个好方法,但我相信你。所以我没有解释为什么我的解决方案不起作用,但你的解决方案似乎有效。非常感谢你的帮助! - bbusseuil
显示剩余2条评论
1个回答

1

根据评论中的信息,我认为您的解决方案无法正常工作,因为您正在Click事件处理方法中重新创建控件,这在页面生命周期的最后阶段非常晚,并且不应用于添加控件。

如评论中所述,建议您在Page_InitPage_Load中创建控件,而不要在按钮的Click处理方法中重新创建它们。您还应该为每个控件分配唯一的ID。然后,在Click处理程序中,您可以使用FindControl方法访问已创建的控件。或者,您可以在创建时保存对控件的引用,以便稍后轻松访问它们。

有用的链接:


1
我没有使用 FindControl() 技术,而是在我的 UserControls 容器上使用 foreach() 解决了我的问题,因为我必须对每个 UserControls 执行操作。但是感谢您的帮助,现在我明白为什么它不起作用 :)。 - bbusseuil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接