C#asp.net Button_Click事件处理程序无法正常工作

时间:2011-03-15 10:19:02

标签: c# button event-handling webusercontrol

我有一个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);

}

所以说完所有这些,然后我运行我的程序,他将控件添加到我的占位符,但是当我点击按钮时,他没有向我的占位符添加新控件,只是清除我的占位符由于某些原因。通常情况下一切都应该没问题,但是当我点击按钮时,我试图看看他是否真的触发了事件,但事实并非如此。我试图给你一个我的代码示例,因为整个页面的代码非常大,根本无法帮助你。任何想法为什么他没有解雇按钮事件?

2 个答案:

答案 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的回答;你的控制力不再存在