2013-06-04 55 views
3

我在創建中繼器內部項目的觸發器時遇到了一些麻煩。我想一個Linkbutton控制從一個更新面板內觸發回發,我在標記定義爲Button控制觸發的正常工作:中繼器內多個更新面板觸發器

<Triggers> 
    <asp:PostBackTrigger ControlID="button" /> 
</Triggers> 

但是,我不能爲LinkButton就做這個因爲他們是動態創建的,唯一的解決辦法是將我的中繼器添加爲每個按鈕觸發數據綁定事件,像這樣:

//Inside repeater itemdatabound... 
var trigger = new PostBackTrigger(); 
trigger.ControlID = linkButton.UniqueID; 
updatepanel.Triggers.Add(trigger); 

運行此代碼,我收到一個錯誤:

A control with ID 'ctl00$content$repeater$ctl01$linkButton' could not be found for the trigger in UpdatePanel 'updatepanel'.

我該如何爲每個LinkButtons動態添加觸發器?

回答

7

解決了這個問題。我假設它在我的OP中不起作用的原因是因爲中繼器控件不能直接被更新面板看到。

我懷疑移動它們在中繼器之外會解決它或調整FindControl("linkbutton")調用深入到控制中繼器,使用這種方法意味着我需要爲每個控制器創建兩個鏈接按鈕對象這是不可取的。

不過,我認爲解決方法就是註冊LinkButton控件使用ScriptManager回傳控制:

//Create triggers for each 'remove' button 
ScriptManager scriptManager = ScriptManager.GetCurrent(Page); 
if (scriptManager != null) 
{ 
    scriptManager .RegisterPostBackControl(linkbutton); 
} 

在中繼OnItemDataBound事件,解決了這個問題。

0

我似乎記得,你可以使用clientID而不是uniqueID屬性。

+0

我已經與這個嘗試,它產生相同的結果不幸 – DGibbs

+0

回答了這個自己的情況下,你有興趣。儘管如此,謝謝你們 – DGibbs

0

整潔的解決辦法是:

protected void MyRepeater_OnItemCreated(object sender, RepeaterItemEventArgs e) 
    { 
     //Inside ItemCreatedEvent 
     ScriptManager scriptMan = ScriptManager.GetCurrent(this); 
     LinkButton btn = e.Item.FindControl("btnSubmit") as LinkButton; 
     if (btn != null) 
     { 
      btn.Click += btnSubmit_Click; 
      scriptMan.RegisterAsyncPostBackControl(btn); 
     } 
    } 

This is the source thread

相關問題