代码之家  ›  专栏  ›  技术社区  ›  John Rudy

ASP.NET用户控件上的事件是否每隔单击一次引发一次?

  •  1
  • John Rudy  · 技术社区  · 16 年前

    是的,有一个类似的问题 here . 然而,这个问题似乎没有附加代码(尽管它可能在某个时刻有;我看到答案暗示着代码),而关于它的公认答案(和其他建议)并不能让我找到我需要的地方。

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

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

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

    四个箭头(以及中心X-或眼睛,取决于框的可见性)是 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
    

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

    每个 其他 回发后,用户控制按钮事件不会触发。他们发起了一个新的反击,在第二个反击中,他们表现得很好。所以,本质上,我的控件需要两次单击才能完成任何操作。

    具体来说,控件在 Page.Load 事件处理程序。我试过了 PreInit ,但这不起作用,因为页面结构的其余部分尚未构建,因此尝试将它们放置在适当的位置 PlaceHolder S与A失败 NullReferenceException . 我在网上搜索过,没有看到类似的情况,我必须承认,在我从用户控件(如 每一个 本站页面),没有问题。另一方面,这是站点上唯一一个在运行时动态加载具有事件的用户控件的页面…

    我现在觉得很蠢。每次都有助于使事件可靠地上升吗?我做错什么了?

    3 回复  |  直到 15 年前
        1
  •  1
  •   bdukes Jon Skeet    16 年前

    我也遇到过类似的问题,结果是事件处理程序中的一些代码破坏了事件,重新连接到按钮。我认为是在Click事件导致更改之后重新加载了控件,但重新创建了控件的容器,而不仅仅是重新绑定。

    希望有帮助。

        2
  •  1
  •   Community THelper    7 年前

    明白了。在他的 answer ,布克斯州:

    我想是我在重新装货 单击事件后的控件 导致了更改,但正在重新创建 控件的容器,而不是 刚刚重新绑定。

    这基本上就是这里的情况。我正在从该控件的事件处理程序调用的方法中调用第二次创建控件的方法。这是在重新创建控件,这似乎导致了回发混淆。我用老式的痕迹验证了这一点。

    我把它清理干净了,现在我只有一些其他的虫子需要清理——但那些我可以自己解决的虫子。谢谢,Bukes!

        3
  •  1
  •   anjop    15 年前

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

    如果重写“clientid”和“uniqueid”,强制两者都返回预定义的值,则可以解决此问题(请参见 link text )