ASP.net动态创建的控件事件处理

ASP.net动态创建的控件事件处理,asp.net,user-controls,composite,event-handling,Asp.net,User Controls,Composite,Event Handling,实际上,我在页面加载时动态地将占位符添加到页面中 然后,我有一个复合控件,它被添加到占位符中,并在运行时为特定页面事件显示。复合控件有一个按钮。我在复合控件中为按钮提供了一个公共eventhandler,但实际上在页面代码中没有直接访问此eventhandler的权限 要显示控件,我将进行以下调用,例如: MyControl.Create(args, new EventHandler(OnClick)); 然后在页面上,我将有protectedvoidonclick(objecto,Even

实际上,我在页面加载时动态地将占位符添加到页面中

然后,我有一个复合控件,它被添加到占位符中,并在运行时为特定页面事件显示。复合控件有一个按钮。我在复合控件中为按钮提供了一个公共eventhandler,但实际上在页面代码中没有直接访问此eventhandler的权限

要显示控件,我将进行以下调用,例如:

MyControl.Create(args, new EventHandler(OnClick)); 
然后在页面上,我将有
protectedvoidonclick(objecto,EventArgs args){}

当然,当我调用
create()
时,我会将eventhandler连接到复合控件的按钮单击事件。到现在为止,一直都还不错。连接按钮后,按钮单击将按预期发回控件。但是,事件永远不会返回到页面的事件处理程序

我意识到问题发生在回发上。然而,尝试在init、load或createchildcontrols上连接按钮都无法保持连接,因此事件可以在页面上处理。我想要的是,能够在运行时将eventhandler传递给复合控件,并且复合控件能够在回发时正确地将事件发送回页面

有趣的是,如果我使用自定义eventargs调用OnBubble,我可以在页面上捕获冒泡事件。但问题是我的占位符在页面上,因此当我尝试调用UserControl中的
MyControl.Create()
时,冒泡会转到页面而不是UserControl(如预期的那样)。因此,我更喜欢声明eventhandler而不是重写
OnBubble
(UserControls和其他声明MyControl的控件基本上会使它对按钮单击事件毫无用处)

我希望有人能对这个问题有所了解。这似乎是一个有趣的问题,但除了在页面上显式声明控件,并在标记或pageload中直接连接事件之外,可能没有其他解决方案。我会考虑让按钮做异步回调,但是如果可能的话,更喜欢使用标准的ASP.NET事件处理。p> 谢谢

添加说明:
MyControl.Create()
调用实际上生成了一个调用复合控件的
Create()
方法的事件。这一切都很好,但值得注意的是,
MyControl.Create()
方法不能直接访问该控件。这应该是有意义的,因为控件已添加到非in标记上的页面
onload

更多代码:

MyControl : CompositeControl 
{
     public event EventHandler Click;

     //I have a create method
     void Create(args, EventHandler click)
     {
          this.Click = click;
          //other processing
     }

     //then the button is wired up. I've tried in OnInit(), OnLoad()
     void CreateChildControls()
     {
           MyButton.OnClick += Click;
     }

     //if I wire up the button to a default handler I can check if
       Click is not null and send the click event onto the next handler 
     //this is where the bubble event works, but the wiring fails
} 
编辑:我尝试在会话中存储eventhandler并在回发时连接按钮,但成功。我不认为这是一个好的做法,我认为这不符合我的目的。例如,在本例中,页面上的事件按预期执行,但具有非标准页面行为。例如,Response.Redirect()抛出异常。这应该是有意义的,因为eventhandler可能在回发过程中丢失了状态信息。 有几点想法: 1.我是否可以创建一个与此控件相关的自定义气泡事件?这似乎是有道理的,但页面回发的问题再次给我留下了相同的问题,即泡沫应该去哪里。那么,当我调用create()时,是否可以自动将UserControl注册为冒泡的目标?这似乎很难。
2.页面生命周期中是否有某个点可以在UserControl声明的eventhandler上重新连接事件,以便在回发时正确调用委托?这似乎是我所缺少的。eventhandler是在回发时创建的,但由于OnClick期间未在UserControl中重新创建而丢失。我不希望UserControl必须显式地重新创建对象,而是希望子控件为UserControl重新创建它。这听起来像是一个简单的请求,但由于UserControl不在循环中,我可能在请求不可能的结果

将控件动态插入占位符的动机是什么?请求之间实际上不存在页面,因此任何动态插入的控件都无法生存。你基本上得假装一下


您可能要考虑的一个选项是编写自定义控件,该控件具有不同的呈现模式,但具有一致的事件接口。另一种方法是使用ASP.NET多视图控件,该控件仅在HTML中呈现可见视图,但仍在不可见视图中维护事件处理程序。

将控件动态插入占位符的动机是什么?请求之间实际上不存在页面,因此任何动态插入的控件都无法生存。你基本上得假装一下


您可能要考虑的一个选项是编写自定义控件,该控件具有不同的呈现模式,但具有一致的事件接口。另一种方法是使用ASP.NET多视图控件,它只在HTML中呈现可见视图,但仍在不可见视图中维护事件处理程序。

好的,如果我错了,请纠正我,Create()方法实际上实例化了内部控件并将其设置为已知状态;我看到您已经有了对按钮的引用,那么为什么此时需要额外的单击事件呢

当您调用Create()时,您将初始化控件及其按钮,然后,当您知道按钮在那里时,连接您的事件处理程序,传递您在那里得到的参数

MyControl : CompositeControl
{
    void Create(args, EventHandler click)
    {
        // init & set up your control

        // other processing

        MyButton.OnClick += click;
    }
}

好的,如果我错了,请纠正我,您的Create()方法实际上实例化并将您的内部控件设置为已知状态;我看到您已经有了对按钮的引用,那么为什么此时需要额外的单击事件呢

当您调用Create()时,您将初始化控件及其按钮,然后,当您知道按钮在那里时,连接事件处理程序p