我是一名.NET的初学者,从昨天早上开始寻找解决问题的方法,但一直没有找到答案。
这是我的问题:
我需要传递参数,所以通过以下方式动态创建了一些用户控件:
在这个ASCX中,我有一个按钮,当用户点击它时,我想调用包含在我的ASPX中的一个方法,所以我在ASCX中这样做:
在ASPX中的内容如下:
这是我的问题:
我需要传递参数,所以通过以下方式动态创建了一些用户控件:
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
方法中添加所有需要的控件。 - Lukasz MPage_Load
中创建控件,而不是在单击处理事件中删除/重新创建它们,但只在那里设置现有控件的属性。如果您需要在Page_Load
中使用一些额外的参数,我想您可以通过将它们作为查询字符串传递给页面来传递一些额外的参数,例如使用Button.PostBackUrl
属性。 - Lukasz MPage_Load
中创建时保存对那些控件的引用,然后在点击处理方法中使用它们;或者你可以通过FindControl()
方法访问它们。无论哪种方式,你都应该为你动态创建的每个控件分配唯一的 ID,这样你就可以使用FindControl()
找到它,并允许 asp.net 正确地处理它们的视图状态(这可能是必要的)。 - Lukasz M