【问题标题】:Events between an ASPX and ASCXASPX 和 ASCX 之间的事件
【发布时间】:2012-05-03 07:50:58
【问题描述】:

我是 .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 方法中添加您需要的所有控件。
  • 我在 Page_Load 中添加这些控件,我的方法 initListOfAnnouncement() 在 Page_Load 中被调用。问题是,当我单击时,我需要更改我的用户控件(例如,将其中一个文本以粗体显示),但不加载所有页面,因为如果我这样做,我将丢失所有参数, 并丢失 UserControl 必须以粗体显示的内容。不知道我的解释够不够清楚。
  • 我仍然建议您Page_Load 中创建控件,而不是在点击处理事件中删除/重新创建它们,而只在此处设置现有控件的属性。如果您需要Page_Load 中的一些附加参数,我想您可以将一些附加参数传递给页面,即使用Button.PostBackUrl 属性将它们传递到查询字符串中。
  • 有几种方法可以做到这一点:您可以在Page_Load 创建时保存对这些控件的引用,然后在点击处理方法中使用它们,或者您可以通过FindControl() 方法访问它们。无论哪种方式,您都应该为您动态创建的每个控件分配唯一 ID,以便您可以使用 FindControl() 找到它并允许 asp.net 正确处理它们的视图状态(可能需要)。
  • 嗯好的。我认为这不是一个好方法,但我相信你。所以我没有解释为什么我的解决方案不起作用,但你的解决方案似乎有效。非常感谢您的帮助!

标签: asp.net .net events ascx


【解决方案1】:

根据 cmets 中的信息,我认为您的解决方案不起作用,因为您正在 Click 事件处理方法中重新创建控件,该方法在页面生命周期中很晚,不应该用于添加控件.

正如cmets中提到的,我建议您在Page_InitPage_Load中创建控件,而在按钮的Click处理方法中重新创建它们。您还应该为每个人分配一个唯一的 ID。然后,在Click 处理程序中,您可以使用FindControl 方法来访问创建的控件。或者,您可以在创建时保存对控件的引用,以便以后轻松访问它们。

有用的链接:

【讨论】:

  • 我没有使用FindControl() 技术,而是在我的UserControls 容器上使用foreach() 来解决我的问题,因为我必须对每个UserControls 执行操作。但是感谢您的帮助,现在我明白为什么它不起作用了:)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 2013-09-08
  • 2012-01-11
  • 1970-01-01
相关资源
最近更新 更多