【问题标题】:Dynamically created sub-classed dropdownlist not firing event动态创建的子分类下拉列表未触发事件
【发布时间】:2011-10-20 04:34:11
【问题描述】:

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

我有一个 BasePage 类,我的 .aspx 继承自该类;我还有 BaseLabel 和 BaseDDL 类,它们分别扩展了 Label 和 Dropdownlist。最重要的是,我有一个 ReadyDDL 类,它将 BaseLabel 和 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 上重新创建下拉菜单,一切都会好起来的。但是-

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

ddl.SelectedIndexChanged += new EventHandler(X);

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

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

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

经过反思,我想,渲染处理程序仅将事件添加到控件中,就客户端而言,服务器不知道 - 但我该如何克服这一点,并在控件初始化时定义处理程序,当处理程序与初始化代码不在同一个源代码文件中时?

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

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

b) 所选值在回发时丢失。我知道我必须对 Viewstate 做点什么,但我还没有弄清楚到底是什么。如果您知道我如何实施解决方案,将非常感谢您提供一个简短的示例。

【问题讨论】:

  • 你在哪里设置AutoPostBack=true下拉菜单?
  • 记录事件时在 ReadyDDL 中。

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


【解决方案1】:

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

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

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

childDll 是对您的子 ddl 控件的引用。

【讨论】:

  • 绝妙的答案!非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
相关资源
最近更新 更多