2008-11-21 56 views
0

是的,還有類似的問題here。然而,這個問題似乎沒有附加代碼(雖然它可能在某些時候;我看到的答案暗指代碼),而接受的答案(和其他建議)沒有讓我在我需要的地方成爲。ASP.NET UserControl上的事件引發了其他每次點擊?

我有一個相當複雜,坦率地說不是很好設計的VB.NET Web應用程序,我正在擴展一個新功能。該功能的簡短形式是它允許管理用戶重新定位主頁上的某些元素。在此階段重新設計Web部件不是一種選擇。

的管理頁面,允許調整大小使用簡單的用戶控件來代表每個主頁上的「盒子」可以移動(原諒我的ASCII藝術):

+------------+ 
| Box Title | 
+------------+ 
|  /\  | 
| <X> | 
|  \/  | 
+------------+ 

四個箭頭(和中心X或眼睛,取決於盒子的可見度)是ImageButtons。每個ImageButtonClick事件被連接到編碼類似於以下:

RaiseEvent WidgetMoved(Me, New WidgetMovedEventArgs(WidgetMoveDirection.Up, widgetIDField.Value)) 

在代管網頁(其本身上的MasterPage)結合,在那裏它們被定位它決定了數據之後,開始這些用戶控制:

For i as Integer = 0 To count 
    Dim widget As MyWidget = widgets(i) '' widgets is a collection 
    Dim box as controls_CustomizeWidget = BindWidget(WidgetColumns.Left, i, count, widget) '' This simply uses LoadControl and places the control in one of two placeholders 
    AddHandler box.WidgetMoved, AddressOf widget_WidgetMoved 
    AddHandler box.WidgetVisibleChanged, AddressOf widget_WidgetVisibleChanged 
Next 

帶有此代碼的方法在每次頁面加載時調用,無論我是否在回發中。 (我「live-save」的數據;你做了一個修改,它在那個回發中保存到數據庫,然後重新加載。)

其他回發,用戶控件按鈕事件不會觸發。他們發起了一個新的回傳,在第二個回合中,他們開火很好。所以,基本上,我的控件需要兩次點擊來完成任何事情。

具體而言,控件在Page.Load事件處理程序中被初始化。我嘗試了PreInit,但是這並不起作用,因爲頁面結構的其餘部分尚未構建,因此嘗試將它們放置在合適的PlaceHolder s中時失敗,並顯示NullReferenceException。我在網上搜索過,沒有看到任何這樣的內容,我不得不承認,在其他情況下,我通過用戶控件(例如,每個頁面)引發事件,這是沒有問題的。另一方面,這是網站上唯一的一個頁面,用戶可以在運行時動態加載帶事件的控件...

我現在感覺非常笨拙。每一次都可以幫助獲得可靠的事件?我究竟做錯了什麼?

回答

1

我有一個類似的問題,最終成爲事件處理程序中的一些代碼,將事件重新連接到按鈕。我認爲是在點擊事件導致更改後重新加載控件,而是重新創建控件的容器,而不僅僅是重新綁定。

希望有所幫助。

1

想通了。在他的answer,bdukes規定:

我認爲這是,我是重裝 控制後單擊事件有 變化的原因,但重建 控件容器,而不是僅僅 重新綁定。

這在本質上就是這種情況。我從調用所述控件的事件處理程序的方法中調用第二次創建控件的方法。這是重新創建控件,這似乎是造成回傳混淆。我用良好的老式Trace驗證了這一點。

我把它清理乾淨了,現在我只剩下一些其他的bug來壓扁 - 但那些我可以自己做。謝謝,bdukes!

0

出現此問題的原因是用戶控件在第一次回發後更改了名稱。

如果覆蓋「ClientID」和「UniqueID」強制返回預定義值,則可以解決此問題(請參閱link text

相關問題