1

いくつかのラベル、テキストボックス、そして最終的にはボタンなど、いくつかのコントロールを備えたwebusercontrolがあります。このコントロールの目的は、webusercontrolのボタンをクリックするたびに、プレースホルダーのメインページに追加することです。

これは、Webコントロールのボタンの背後にあるコードです

  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

したがって、動的に追加したボタンがポストバックすると、新しいページインスタンスが作成され、そのボタンは存在しなくなります (前のボタンクリックで追加しただけなので)、再作成されていません。

ポストバックごとに動的コントロールを再作成する必要があります

ポストバックごとに Page クラスの新しいインスタンスが作成されることに注意してください。以前に作成されたコントロール、イベント ハンドラーは、明示的に再作成しない限り、新しいインスタンスには存在しません。

于 2011-03-15T10:44:21.727 に答える
0

これらの基準は、ユーザーがナビゲートできるある種のツリー構造であると想定しています(そして、うまくいけばどこかで最後に到達しますか?)。

btnCriteriaToevoegen_Click について:
なぜメソッド内でイベントを定義しているのですか?

critlijn_ButtonDoorgaan と addCriteriaButton では:
列挙子を使用する代わりに、

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

ええ、それはまだ完全に理解できるとは言えませんが、少なくとも私は正しく試しましたか? :)

編集

さて、私はこの質問があります:

イベントが発生したときに実行する必要があるイベントハンドラーは、メインページで次のように定義されています。

あなたがそうするとき、あなたはそれをどのくらい確信していますか

EventHandler eventhandler = ButtonDoorgaan;

変数「eventhandler」は、ButtonDoorgaan に接続されているすべてのイベント ハンドラを取得しますか?

EDIT 2(リターン)

Richard Friend の回答を参照してください。あなたのコントロールはもうありません

于 2011-03-15T10:37:08.017 に答える