我有一个webusercontrol,上面有一些控件,比如一些标签,一个文本框,最后是一个按钮。这个控件的目的是每次单击webusercontrol上的按钮时将它添加到占位符的主页面中。
这是我的webcontrol上的按钮背后的代码
protected void btnCriteriaToevoegen_Click(object sender, EventArgs e)
{
//New eventhandler == all of the eventhandlers of all the objects who have subscribed to the event.
EventHandler eventhandler = ButtonDoorgaan;
ButtonOpslaanEvent mijnevent = new ButtonOpslaanEvent();
//Basic variables I will give with my costum event(ButtonOpslaanEvent)
mijnevent.Naam = txtCriteriumNaam.Text;
mijnevent.Score = Convert.ToInt16(DdlCriteriumScoreSchaal.SelectedValue);
int weging = Convert.ToInt16(DdlCriteriumWeging.SelectedValue) - 1;
mijnevent.Weging = Convert.ToInt16(weging);
//If the eventhandler is not null, for every object that has an eventhandler, execute it.
if(eventhandler!=null)
eventhandler(sender, mijnevent);
}
在事件被触发时需要执行的事件处理程序在我的主页中定义如下:
private void critlijn_ButtonDoorgaan(object sender, EventArgs e)
{
ButtonOpslaanEvent eigenevent = (ButtonOpslaanEvent)e;
IEnumerator<Domein> domeinenumerator = domeinen.GetEnumerator();
while (domeinenumerator.MoveNext())
{
if (domeinenumerator.Current.DomeinNaam.Equals(lijstdomeinitemgeselecteerd))
{
Criterium nieuwcriterium = new Criterium();
nieuwcriterium.CriteriumNaam = eigenevent.Naam;
nieuwcriterium.CriteriumScore = Convert.ToString(eigenevent.Score);
nieuwcriterium.CriteriumWeging = Convert.ToString(eigenevent.Weging);
domeinenumerator.Current.Criteriums.Add(nieuwcriterium);
}
}
btnCriteriaToevoegen_Click(sender, e);
}
btnCriteriaToevoegen_Click事件触发然后调用此方法(addCriteriaButton()),它将按钮添加到主页面中的占位符:
private void addCriteriaButton()
{
Criterialijn criterialijn = (Criterialijn)LoadControl("~/Criterialijn.ascx");
//Add eventhandlers to control
criterialijn.ButtonDoorgaan += new EventHandler(critlijn_ButtonDoorgaan);
criterialijn.Aangevinkt += new EventHandler(critlijn_Aangevinkt);
//Every control on the page except this one, not enabled
IEnumerator<Criterialijn> criterialijnenumerator = criteriacontrols.GetEnumerator();
while (criterialijnenumerator.MoveNext())
{
criterialijnenumerator.Current.Enabled = false;
}
//Add it to a list of webusercontrols that are currently on screen
criteriacontrols.Add(criterialijn);
criterialijn.Enabled = true;
//Add to placeholder
plhCriteria.Controls.Add(criterialijn);
}
所以说完所有这些,然后我运行我的程序,他将控件添加到我的占位符,但是当我点击按钮时,他没有向我的占位符添加新控件,只是清除我的占位符由于某些原因。通常情况下一切都应该没问题,但是当我点击按钮时,我试图看看他是否真的触发了事件,但事实并非如此。我试图给你一个我的代码示例,因为整个页面的代码非常大,根本无法帮助你。任何想法为什么他没有解雇按钮事件?
答案 0 :(得分:2)
因此,当您动态添加回发的按钮时,会创建一个新的页面实例并且该按钮不再存在(因为您只在上一次按钮单击时添加了该按钮),所以它尚未重新创建。
You must re-create dynamic controls on each postback
记住,为每个回发创建了一个新的Page类实例,任何以前创建的控件,事件处理程序都不会存在于新实例中,除非您明确地重新创建它们。
答案 1 :(得分:0)
我认为这些Criteria是某种用户可以浏览的树形结构(希望能够到达某个地方?)。
关于btnCriteriaToevoegen_Click:
为什么要在方法中定义事件?
在critlijn_ButtonDoorgaan和addCriteriaButton中:
而不是使用枚举器,只需使用
foreach(var control in criteriacontrols)
control.Enabled = false;
所以,是的,公平地说,它仍然不太容易理解,但它最少尝试过吗? :)
修改强>
好的,那我有这个问题:需要的事件处理程序 触发事件时执行的是 在我的主页中定义如下:
当你这么做时,你有多确定
EventHandler eventhandler = ButtonDoorgaan;
变量“eventhandler”将所有事件处理程序附加到ButtonDoorgaan?
编辑2 (返回)
见Richard Friend的回答;你的控制力不再存在