2011-03-15 46 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