基于在另一用户控件中的选择在用户控件中重新创建动态控件
本文关键字:用户 控件 创建 动态控件 新创建 选择 | 更新日期: 2023-09-27 17:57:58
大约5个月前,我的任务是为我现在的雇主创建一个新的内部网站,因为旧的网站是一个噩梦。该站点使用多种.NET
语言(classic asp
、VB
和C#
)和多种.NET frameworks
(1.0、2.0、3.5,很少有4.0的地方)。实现和测试只需要一个小时的简单更改只需要几天的时间。
新的intranet站点内容是通过用户控件控制的,这些控件在加载时根据您所在的页面和您的访问级别动态加载。每个用户控件都有一个特定的任务,并且不会影响页面上的任何其他用户控件。
大约3周前,我的数据库管理员(上一份工作时是一名应用程序开发人员)向中层管理人员提出了这个想法,即用户控件可以相互对话,并影响每个用户控件中可用的选择(所有这些我都不知道)。
起初,当我听到这个消息时,我觉得这是不可能的。然后,我读到的关于让用户控件相互通信的所有内容都表明,用户控件必须了解彼此,这是不可能的,因为所有用户控件都是根据您的访问级别在运行时加载的。上周我找到了一个解决方案,我可以让一个用户控件激发一个自定义事件处理程序,并让我的其他用户控件侦听该特定的自定义事件处理。
现在,今天,有人问我是否可以在网站的联系人管理部分添加过滤功能,该部分列出了我们所有的客户,类似于易趣在左侧的过滤器,允许您深入查看返回的结果。例如,您搜索"平板电视"。易趣将列出所有与您搜索匹配的结果,在左侧您可以选择尺寸范围或品牌来缩小结果。
在我设置的页面上,我加载了3个用户控件来处理标准和结果。Control1
具有所有的基本搜索条件(例如行业、地区状态等),control2
具有用于从control1
向下搜索结果的过滤器。Control3
根据control1中的标准显示客户端(因此control1触发control2
和control3
听到的事件,并且它们都根据control1显示结果)。现在,我从control2
中选择条件,并激发control3
可以听到的事件并显示结果。
所有这些工作,我遇到的问题是,control2
中的控件是动态构建的,当control1
中的事件被触发时->然后control2
返回以触发control3
的事件,以听到我丢失了control2
中的所有动态控件,因为无法在Page_Init
中重新创建控件,因为从控件1中的自定义事件传入的值不再存在,因为control2
进行了回发来自CCD_ 21的事件仅在control1 postback时触发。存储从control1
的自定义事件传递到control2
的值的最佳方式是什么,或者让control1
在control2
发布时重新访问这些值,以便在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中,并将这些条件提供给我的动态控件创建方法