【发布时间】:2008-11-21 20:02:11
【问题描述】:
是的,有一个类似的问题here。但是,该问题似乎没有附加代码(尽管它可能在某些时候有;我看到暗示代码的答案),并且接受的答案(和其他建议)并没有让我到达我需要的地方成为。
我有一个相当复杂,坦率地说设计得不好的 VB.NET Web 应用程序,我正在扩展一个新功能。该功能的简短形式是它允许管理用户重新定位主页上的某些元素。在这个阶段,重新设计 Web 部件不是一种选择。
允许调整大小的管理页面使用简单的用户控件来表示主页上可以移动的每个“框”(请原谅我的 ascii 艺术):
+------------+
| Box Title |
+------------+
| /\ |
| < X > |
| \/ |
+------------+
四个箭头(以及中心 X 或眼睛,取决于框的可见性)是ImageButtons。每个ImageButton 的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
在每次页面加载时都会调用带有此代码的方法,无论我是否处于回发状态。 (我“实时保存”数据;您进行更改,它会在回发时保存到数据库中,然后重新加载。)
每other回发,用户控件按钮事件不会触发。他们启动了一个新的回发,并且在这第二个回发中他们开火了。所以,基本上,我的控件需要两次点击才能完成任何事情。
具体来说,再次在Page.Load 事件处理程序中初始化控件。我尝试了PreInit,但这不起作用,因为页面结构的其余部分尚未构建,因此尝试将它们放置在适当的PlaceHolders 中失败并出现NullReferenceException。我在网上搜索过,没有看到类似的东西,我不得不承认,在我从用户控件引发事件的所有其他场景中(例如本网站的 每个 页面),没有问题。另一方面,这是站点上唯一一个在运行时动态加载带有事件的用户控件的页面......
我现在感觉很愚蠢。每次都能可靠地引发事件有什么帮助吗?我做错了什么?
【问题讨论】:
标签: asp.net events user-controls