ASP.NET UserControl上的事件会引发其他每次点击?

时间:2008-11-21 20:02:12

标签: asp.net events user-controls

是的,有一个类似的问题here。然而,这个问题似乎没有附加代码(虽然它可能在某些时候;我看到答案暗指代码),并且接受的答案(以及其他建议)并没有让我到达我需要的地方是。

我有一个相当复杂,坦率地设计得不好的VB.NET网络应用程序,我正在扩展一个新功能。该功能的简短形式是它允许管理用户重新定位主页上的某些元素。在此阶段,重新设计Web部件不是一种选择。

允许调整大小的管理页面使用简单的用户控件来表示主页上可以移动的每个“框”(原谅我的ascii art):

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

四个箭头(以及中心X - 或眼睛,取决于盒子的可见性)是ImageButton s。每个ImageButton的{​​{1}}事件都连接到类似于以下内容的代码:

Click

托管页面(它本身位于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 事件处理程序中初始化。我尝试了Page.Load,但这不起作用,因为页面结构的其余部分尚未构建,因此尝试将它们放在适当的PreInit中会失败并显示PlaceHolder }。我在网上搜索过,并没有看到这样的东西,我不得不承认,在我从用户控件(例如本网站的每个页面)引发事件的每个其他场景中,都有没问题。另一方面,这是网站上唯一一个在运行时动态加载带有事件的用户控件的页面......

此刻我感觉非常愚蠢。每次都可以帮助让事件可靠地提高吗?我做错了什么?

3 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,最终成为事件处理程序中的一些代码,这些代码搞砸了重新连接到按钮的事件。我认为是在点击事件导致更改后我重新加载控件,但是正在重新创建控件的容器,而不仅仅是重新绑定。

希望有所帮助。

答案 1 :(得分:1)

想出来。在他的answer中,bdukes指出:

  

我认为是我正在重装   点击事件后的控件   引起了变化,但正在重新创造   控件的容器,而不是   只是重新绑定。

这基本上就是这种情况。我正在调用第二次创建控件的方法,来自事件处理程序为所述控件调用的方法。这是重新创建控件,这似乎导致了回发混乱。我用好的老式Trace验证了这一点。

我把它弄清了,现在我还有一些其他的东西要挤压 - 但那些我可以自己解决的问题。谢谢,bdukes!

答案 2 :(得分:1)

出现此问题的原因是用户控件在第一次回发后更改名称。

如果覆盖“ClientID”和“UniqueID”强制两者都返回预定义值,则可以解决此问题(请参阅link text