2011-07-01 80 views
2

我遇到了動態創建並插入到我的頁面中的Web控件的問題。我創建了幾個LinkBut​​tons,具體取決於所做搜索的數據,並且我試圖爲每個Button添加一個Event Handler,所以它會過濾結果。動態創建控件未觸發的事件

控件已正確初始化,但事件永遠不會被觸發。

Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init 
    Controls.Clear() 

    Dim btn As Controls.LocalizableLinkButton 
    For Each element As Generic.KeyValuePair(Of String, ResultFilterData) In m_list 

    btn = New LocalizableLinkButton 
    btn.ID = m_Name & "$lnk" & count 
    btn.Label = element.Value.Label.Append(" (" + CStr(element.Value.Count) + ")") 
    btn.CommandArgument = element.Value.Key 
    AddHandler btn.Click, AddressOf Me.btn_Click 

    Controls.Add(btn) 
    Next 
End Sub 

由於此代碼在Page_Init中,所有控件都應在回發時重新創建。 (LocalizableLinkBut​​ton只是LinkBut​​ton的一個擴展,用於向文本添加多語言功能)。

問題是從未調用btn_Click方法。鏈接按鈕在回調中正確初始化,具有與之前相同的ID。但事件並沒有發生。

我使用ASP.Net 2.0

任何想法?

+0

如果將頁面或UserControl的[ClientIDMode](http://www.dotnetperls.com/keyvaluepair)設置爲「Static」,它會工作嗎? –

+0

我忘了提及我正在使用ASP.Net 2.0,並且ClientIDMode僅在4.0中引入,所以這不會有幫助... – Chnoch

回答

2

我終於弄清楚ASP.NET使用我的鏈接按鈕時遇到的問題。

錯誤是在每個LinkBut​​ton的ID中使用'$'符號。當ASP.NET創建Postback Javascript時,ASP.NET顯然使用$符號來構建控件層次結構。因此它認爲LinkBut​​tons嵌套在不存在的控件中。所以這些事件當然不會被解僱。

一旦我刪除$符號,它工作正常。

0

你可能想把這段代碼放在Page_Load中看看。通常建議不要訪問此Page_Init中的控件,因爲不能保證在此階段創建控件。

我不是VB的傢伙,但我把它放在default.aspx的代碼隱藏,它工作正常。

protected void Page_Load(object sender, EventArgs e) 
     { 
      Button button = new Button(); 
      button.Click += new EventHandler(button_Click); 
      button.Text = "test"; 
      Form.Controls.Add(button); 
     } 

     void button_Click(object sender, EventArgs e) 
     { 
      throw new NotImplementedException(); 
     } 
+0

這不會改變任何內容。順便說一下,我主要閱讀的是最好在Page_Init方法中初始化動態控件,以便它們可用於回發。這就是我把它們放在那裏的原因。將它們放在Page_Load中會更好嗎? – Chnoch

+0

我用一個例子更新了答案,你可能想看看。哦,順便說一句,我在Page_Init中做了同樣的事情,它也很好。所以我懷疑你的foreach邏輯中可能存在錯誤。 – Illuminati

+0

感謝您的更新。週二我上班時我會仔細看看。我懷疑控件層次結構中的某些內容是錯誤的,因爲你發佈的示例工作正常,我沒有做任何完全不同的事情...... – Chnoch