网上有很多关于这个主题的帖子,但我找不到符合我情况的帖子;
我有一个我的.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做点什么,但我还没弄明白什么。如果你知道如何实现这个解决方案,那么我们将非常感谢一个简短的例子。
答案 0 :(得分:0)
似乎您正在开发复合控件 - 正确的方法是从CompositeControl类继承并覆盖CreateChildControls以添加子控件。 ASP.NET在生命周期的早期调用此方法,这将消除您的视图状态相关问题。
有关开发复合控制的信息,请参阅this article。对于事件,字符串类型属性不起作用 - 您必须在复合控件级别定义事件。您可以通过在处理程序中引发自己的事件来冒泡孩子的事件(这在文章中显示)。另一种方法是使事件处理程序短路。例如,在复合控件中定义事件,例如
public event EventHandler SelectedIndexChanged
{
add
{
childDdl.SelectedIndexChanged += value;
}
remove
{
childDdl.SelectedIndexChanged -= value;
}
}
childDll
是指您孩子的ddl控件。