动态创建的子类下拉列表不会触发事件

时间:2011-10-20 04:34:12

标签: c# asp.net drop-down-menu custom-server-controls

网上有很多关于这个主题的帖子,但我找不到符合我情况的帖子;

我有一个我的.aspx继承的BasePage类;我也有BaseLabel& BaseDDL类,扩展了Label&分别是下拉列表。最重要的是,我有一个ReadyDDL类,它结合了BaseLabel和amp;将BaseDDL转换为单个控件(但这是一个类,而不是用户控件)并使用它们自己的Div,Table,TableRow,TableCells和&另一个标签。 ReadyDDL类使我能够定义标签&下拉列表&根据以下内容在单个html语句中进行布局:

<moc:ReadyDDL ID="Person" runat="server" Member="@UserID" Caption="Create strike for" 
  DataSourceSQL="SELECT ID, UserName FROM [User] WHERE isDeleted = 0 AND ClientID = 3" TextField="UserName" ValueField="ID"
  OnSelectedIndexChanged="ddl_SelectedIndexChanged" />

但是我有一两个问题:

a)事件没有发生。我读过关于这个主题的帖子说必须重新创建下拉列表OnInit&amp;一切都会好起来的。但是 -

我不是动态创建一个下拉列表,而是一个自定义扩展名 - 因此创建下拉列表的代码不在我的aspx中,其中定义了事件处理程序,但是在一个单独的.cs文件中,因此,我不能写

ddl.SelectedIndexChanged + = new EventHandler(X);

因为X不存在于类中,只存在于页面中。

我发现解决这个问题的唯一方法是公开一个字符串属性(OnSelectedIndexChanged),该属性在BaseDDL中设置另一个属性,并且在渲染BaseDDL时,将OnSelectedIndexChanged属性添加到生成的标记中。

生成的html看起来没问题,并且在屏幕上看起来没问题,当我更改控件中的选择时它会回发,但是事件处理程序没有触发:它当前只包含几个赋值语句,我有一个断点在,并没有达到。

在反思时,我想,渲染处理程序只会在客户端关注的情况下将事件添加到控件中,并且服务器不知道它 - 但我如何克服这一点,并在控件初始化时定义处理程序,当处理程序与初始化代码不在同一源代码文件中时?

有没有人对(1)引发事件,或(2)如何在代码中定义事件而不是通过渲染有任何想法?

有任何问题请问。任何帮助或建议将不胜感激,如果有合适的信息,我会将Q标记为已回答。

b)所选值在回发时丢失。我知道我必须对Viewstate做点什么,但我还没弄明白什么。如果你知道如何实现这个解决方案,那么我们将非常感谢一个简短的例子。

1 个答案:

答案 0 :(得分:0)

似乎您正在开发复合控件 - 正确的方法是从CompositeControl类继承并覆盖CreateChildControls以添加子控件。 ASP.NET在生命周期的早期调用此方法,这将消除您的视图状态相关问题。

有关开发复合控制的信息,请参阅this article。对于事件,字符串类型属性不起作用 - 您必须在复合控件级别定义事件。您可以通过在处理程序中引发自己的事件来冒泡孩子的事件(这在文章中显示)。另一种方法是使事件处理程序短路。例如,在复合控件中定义事件,例如

public event EventHandler SelectedIndexChanged
{
   add
   {
      childDdl.SelectedIndexChanged += value;
   }
   remove
   {
      childDdl.SelectedIndexChanged -= value;
   }
}

childDll是指您孩子的ddl控件。