2011-03-15 95 views
1

我有一个webusercontrol有一些控件就像一些标签,一个文本框,最终一个按钮。此控件的用途是每次单击webusercontrol上的按钮时将其添加到我的主页中的占位符中。C#asp.net Button_Click事件处理程序不工作

这是我的按钮后面的代码在我的三夏

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); 

} 

所以当所有这些都说完了,我运行我的程序时,他将控件添加到占位符中,但是当我单击按钮时,他不会向占位符添加新控件,只是清除占位符因为某些原因。通常情况下,一切都应该没问题,但是我试着去看看他是否真的在点击按钮时触发了事件,而他却没有。我试图给你一个我的代码样本,因为整个页面的代码是相当大的,并不会帮助你。任何想法他为什么不解开按钮事件?

回答

2

因此,当您动态添加回发的按钮时,会创建一个新的页面实例,并且该按钮不再存在(因为您只在前一个按钮上单击添加),它还没有重建。

You must re-create dynamic controls on each postback

Remeber,Page类的新实例为每个回发,以前创建的任何控件创建事件处理程序将不会存在于新的实例,除非你明确地重新创建它们。

+0

+1给我“当然!”感觉 – 2011-03-15 10:49:32

0

我认为这些标准是用户可以浏览的某种树结构(并希望到达某处的末端?)。

关于btnCriteriaToevoegen_Click:
为什么在一个方法中定义一个事件?

在critlijn_ButtonDoorgaan和addCriteriaButton:
而不是使用枚举,只需用

foreach(var control in criteriacontrols) 
    control.Enabled = false; 

所以是的,公平地说,它仍然不是很comprehensable,但至少我尝试过吗? :)

编辑

OK,然后我有这样的疑问:

需要被 时会触发该事件是在我的主网页像这样定义 执行的事件处理程序:

如何确保你的是,当你做

EventHandler eventhandler = ButtonDoorgaan; 

变量“eventhandler”获取所有连接到ButtonDoorgaan的事件处理程序?

EDIT 2(返回)

见理查德朋友的回答;您的控制不再存在

+0

事件我交给我的主页的事件处理程序需要额外的信息,所以我定义了我自己的事件(ButtonOpslaanEvent),其中一些属性在点击按钮时获取值,然后主页面可以使用此信息创建一个新的Criterium。这些“Criteriums”的目的是为每个webusercontrol提供一个标准对象,以便以后可以在LINQ中将它们写入到我的数据库中。 – 2011-03-15 10:42:02

+0

我可以检查变量是否分配了所有的事件处理程序,如果它只是输入按钮的click_event并获得该行代码。我的意思是,看起来他根本不开火,就像控制不再存在一样。 – 2011-03-15 10:59:40