1

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

}

所以当所有这一切都说完了,我运行我的程序时,他将控件添加到我的占位符中,但是当我单击按钮时,他没有向我的占位符添加新控件,只是出于某种原因清除了我的占位符. 通常一切都应该没问题,但我试图看看当你点击按钮时他是否真的触发了事件,而他没有。我试图给你一个我的代码示例,因为整个页面的代码很大,对你没有帮助。任何想法为什么他没有触发按钮事件?

4

2 回答 2

2

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

您必须在每次回发时重新创建动态控件

Remeber, a new instance of the Page class is created for each postback, any previously created controls, event handlers will not exists in the new instance unless you explicitly re-create them.

于 2011-03-15T10:44:21.727 回答
0

我假设这些 Criteria 是用户可以浏览的某种树结构(并希望最终到达某个地方?)。

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

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

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

所以,是的,公平地说它仍然不太容易理解,但至少我尝试过对吗?:)

编辑

好的,那么我有这个问题:

触发事件时需要执行的事件处理程序在我的主页中定义,如下所示:

你有多确定,当你这样做时

EventHandler eventhandler = ButtonDoorgaan;

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

编辑2(返回)

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

于 2011-03-15T10:37:08.017 回答