基于在另一用户控件中的选择在用户控件中重新创建动态控件

本文关键字:用户 控件 创建 动态控件 新创建 选择 | 更新日期: 2023-09-27 17:57:58

大约5个月前,我的任务是为我现在的雇主创建一个新的内部网站,因为旧的网站是一个噩梦。该站点使用多种.NET语言(classic aspVBC#)和多种.NET frameworks(1.0、2.0、3.5,很少有4.0的地方)。实现和测试只需要一个小时的简单更改只需要几天的时间。

新的intranet站点内容是通过用户控件控制的,这些控件在加载时根据您所在的页面和您的访问级别动态加载。每个用户控件都有一个特定的任务,并且不会影响页面上的任何其他用户控件。

大约3周前,我的数据库管理员(上一份工作时是一名应用程序开发人员)向中层管理人员提出了这个想法,即用户控件可以相互对话,并影响每个用户控件中可用的选择(所有这些我都不知道)。

起初,当我听到这个消息时,我觉得这是不可能的。然后,我读到的关于让用户控件相互通信的所有内容都表明,用户控件必须了解彼此,这是不可能的,因为所有用户控件都是根据您的访问级别在运行时加载的。上周我找到了一个解决方案,我可以让一个用户控件激发一个自定义事件处理程序,并让我的其他用户控件侦听该特定的自定义事件处理。

现在,今天,有人问我是否可以在网站的联系人管理部分添加过滤功能,该部分列出了我们所有的客户,类似于易趣在左侧的过滤器,允许您深入查看返回的结果。例如,您搜索"平板电视"。易趣将列出所有与您搜索匹配的结果,在左侧您可以选择尺寸范围或品牌来缩小结果。

在我设置的页面上,我加载了3个用户控件来处理标准和结果。Control1具有所有的基本搜索条件(例如行业、地区状态等),control2具有用于从control1向下搜索结果的过滤器。Control3根据control1中的标准显示客户端(因此control1触发control2control3听到的事件,并且它们都根据control1显示结果)。现在,我从control2中选择条件,并激发control3可以听到的事件并显示结果。

所有这些工作,我遇到的问题是,control2中的控件是动态构建的,当control1中的事件被触发时->然后control2返回以触发control3的事件,以听到我丢失了control2中的所有动态控件,因为无法在Page_Init中重新创建控件,因为从控件1中的自定义事件传入的值不再存在,因为control2进行了回发来自CCD_ 21的事件仅在control1 postback时触发。存储从control1的自定义事件传递到control2的值的最佳方式是什么,或者让control1control2发布时重新访问这些值,以便在control2中重新创建动态控件?

注意:我尝试使用会话,但在第一次搜索后从control1重新分配值时遇到了问题。我相信它们不起作用的原因是我设置control1的方式,并且在control2中创建动态控件是跳过获取会话值。

我提前感谢你们所有人(希望)的有益回应。

更新
事实证明,我在运行时将用户控件加载到默认页面上的方式是"control2"中的动态控件在"control2"返回时没有重新创建的原因。我的默认页面在"page_load"而不是"page_init"中加载了用户控件(一定忘记了像我的所有其他页面一样将用户控件的加载移动到"page_int")。进行了切换,并在回发时重新创建了动态控件。

将代码从"page_load"移动到"page_init"后,我遇到的唯一问题是,即使我选中了"checkbox"控件,在回发时也会取消选中它们。我能够通过一些会话变量来克服这个问题。

基于在另一用户控件中的选择在用户控件中重新创建动态控件

这是一个常见的问题。

只有在page_init事件中动态创建的控件才能在回发后幸存。

page_init期间,动态创建的控件成为DOM的一部分,从而具有sessionstates。如果您可以重新考虑代码以在page_init期间激发动态控件创建,那么您的控件应该可以生存。

更新:

我从你的评论和帖子中意识到,你不愿意使用会话。问题是会话是保存控件的唯一方法。

  • 我处理这种情况的一种方法是创建一个带有控件列表的类对象。当我回到页面时,如果Object存在,我会将其作为默认值
  • 我处理这个问题的第二种方法是将搜索条件保存在Session中,并将这些条件提供给我的动态控件创建方法