2011-10-20 70 views
0

網上有很多關於這個主題的帖子,但我找不到適合我的情況的帖子;動態創建的分類下拉列表沒有觸發事件

我有一個BasePage類,它是我的.aspx繼承的;我也有BaseLabel & BaseDDL類,分別擴展標籤&下拉列表。最重要的是,我有一個ReadyDDL類,它將BaseLabel & BaseDDL組合到單個控件中(但這是一個類,而不是用戶控件),並將它們與他們自己的Div,Table,TableRow,TableCells,&另一個Label進行了呈現。該ReadyDDL類使我定義標籤在一個單一的HTML語句&下拉列表&佈局按:

<moc:ReadyDDL ID="Person" runat="server" Member="@UserID" Caption="Create strike for" 
    DataSourceSQL="SELECT ID, UserName FROM [User] WHERE isDeleted = 0 AND ClientID = 3" TextField="UserName" ValueField="ID" 
    OnSelectedIndexChanged="ddl_SelectedIndexChanged" /> 

但是我有一個問題或兩個:

一)事件犯規火災。我已閱讀這個主題的帖子說,必須重新創建下拉菜單OnInit &一切都會好起來的。但 -

我沒有動態地創建一個下拉列表,而是一個自定義擴展 - 因此創建dropdownlist的代碼並沒有在我的aspx中定義事件處理程序,而是在一個單獨的.cs文件中,並且因此,我不能寫

ddl.SelectedIndexChanged + = new EventHandler(X);

因爲X不存在於類中,只有頁面。

我發現解決這個問題的唯一方法是公開一個字符串屬性(OnSelectedIndexChanged),它在BaseDDL中設置另一個屬性,並且在渲染BaseDDL時,將OnSelectedIndexChanged屬性添加到生成的標記中。

生成的html看起來不錯,在屏幕上它看起來沒問題,當我更改控件中的選擇時會回發,但事件處理程序不會觸發:它當前只包含一些賦值語句,我有一個斷點,並沒有達到。

反思一下,我想,渲染處理程序只會將事件添加到控件中,只要客戶端關心,服務器不知道它 - 但我該如何克服這一點,並在控制中定義處理程序初始化,當處理程序不在初始化代碼相同的源代碼文件?

有沒有人有任何想法(1)讓事件觸發,或者(2)我如何在代碼中定義事件,而不是通過渲染?

有任何問題,請提出。任何幫助或建議將不勝感激,如果有合適的信息,我會將Q標記爲已回答。

b)選擇的值在回發時丟失。我知道我必須對Viewstate做些什麼,但我還沒有想出什麼。如果你知道如何實現這個解決方案,一個簡短的例子將不勝感激。

+0

你在下拉菜單中設置了「AutoPostBack = true」?當正在錄製事件時,在ReadyDDL中使用 –

+0

。 –

回答

0

看起來您正在開發一個複合控件 - 正確的方法是繼承CompositeControl類並覆蓋CreateChildControls來添加您的子控件。 ASP.NET在生命週期的早期階段就會調用此方法,這將消除與視圖狀態相關的問題。

參見this article開發複合控制。對於事件,字符串類型屬性不起作用 - 您必須在複合控件級別定義事件。您可以通過在處理程序中引發您自己的事件來冒充孩子的事件(這在文章中顯示)。另一種方法是將事件處理程序短路。例如,定義事件在您的複合控件,如

public event EventHandler SelectedIndexChanged 
{ 
    add 
    { 
     childDdl.SelectedIndexChanged += value; 
    } 
    remove 
    { 
     childDdl.SelectedIndexChanged -= value; 
    } 
} 

childDll是參考你的孩子DDL控制。

+0

夢幻般的答案!非常感謝你。 –

相關問題