【问题标题】:Events on ASP.NET UserControl raise every other click?ASP.NET UserControl 上的事件每隔一次点击就会引发一次?
【发布时间】:2008-11-21 20:02:11
【问题描述】:

是的,有一个类似的问题here。但是,该问题似乎没有附加代码(尽管它可能在某些时候有;我看到暗示代码的答案),并且接受的答案(和其他建议)并没有让我到达我需要的地方成为。

我有一个相当复杂,坦率地说设计得不好的 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

在每次页面加载时都会调用带有此代码的方法,无论我是否处于回发状态。 (我“实时保存”数据;您进行更改,它会在回发时保存到数据库中,然后重新加载。)

other回发,用户控件按钮事件不会触发。他们启动了一个新的回发,并且在这第二个回发中他们开火了。所以,基本上,我的控件需要两次点击才能完成任何事情。

具体来说,再次在Page.Load 事件处理程序中初始化控件。我尝试了PreInit,但这不起作用,因为页面结构的其余部分尚未构建,因此尝试将它们放置在适当的PlaceHolders 中失败并出现NullReferenceException。我在网上搜索过,没有看到类似的东西,我不得不承认,在我从用户控件引发事件的所有其他场景中(例如本网站的 每个 页面),没有问题。另一方面,这是站点上唯一一个在运行时动态加载带有事件的用户控件的页面......

我现在感觉很愚蠢。每次都能可靠地引发事件有什么帮助吗?我做错了什么?

【问题讨论】:

    标签: asp.net events user-controls


    【解决方案1】:

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

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      想通了。 bdukes 在他的answer 中指出:

      我想是我在重新加载 点击事件后的控件有 引起了变化,但正在重新创建 控件的容器,而不是 只是重新绑定。

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

      我已经把它清理干净了,现在我只需要解决一些其他错误——但我可以自己解决这些错误。谢谢,bdukes!

      【讨论】:

        【解决方案3】:

        出现此行为是因为用户控件在第一次回发后更改了名称。

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

        【讨论】:

          猜你喜欢
          • 2011-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-20
          • 1970-01-01
          • 2019-02-08
          • 1970-01-01
          相关资源
          最近更新 更多