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