【问题标题】:recreation of dynamic controls in user control based in selection in another user control基于另一个用户控件中的选择在用户控件中重新创建动态控件
【发布时间】:2013-02-06 05:10:34
【问题描述】:

大约 5 个月前,我的任务是为我现在的雇主创建一个新的 Intranet 网站,因为与旧网站共事是一场噩梦。该站点使用多种.NET 语言(classic aspVBC#)和多种.NET frameworks(1.0、2.0、3.5,少数地方使用 4.0)。只需一个小时即可实施和测试的简单更改将需要数天才能实施。

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

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

一开始,我听到的时候并不认为这是可能的。然后,我读到的关于让用户控件相互通信的所有内容都表明,用户控件必须相互了解,这是不可能的,因为所有用户控件都是在运行时根据您拥有的访问级别加载的。上周我找到了一个解决方案,我可以让一个用户控件触发一个自定义事件处理程序,并让我的其他用户控件监听那个特定的自定义事件处理程序。

现在,今天,有人问我是否可以在网站的联系人管理部分添加过滤器,该部分列出了我们所有的客户,类似于 Ebay 左侧的过滤器,让您可以更深入地了解返回的结果.例如,您搜索“平板电视”。 Ebay 将列出与您搜索匹配的所有结果,您可以在左侧选择尺寸范围或品牌以缩小结果范围。

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

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

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

我提前感谢你们所有人的(希望)有帮助的回复。

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

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

【问题讨论】:

    标签: c# dynamic user-controls event-handling logic


    【解决方案1】:

    这是一个常见问题。

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

    page_init 期间,动态创建的控件成为DOM 的一部分,从而拥有sessionstates。如果您可以重构代码以在page_init 期间触发动态控件创建,那么您的控件应该会继续存在。

    更新:

    我从您的 cmets 和帖子中了解到您不愿意使用 Sessions。问题是会话是保存控件的唯一方法。

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

    【讨论】:

    • 我知道我需要在 page_init 期间重新创建控件。我遇到的问题是我需要的值,以便在 control2 回发时丢失基于传递给 control2 的值 control1 重新创建完全相同的控件。我正在寻找存储从 control1 传递到 control2 的值的最佳方式,以便在 control2 回发时重新创建 control2 中的控件。
    • 我明白了。也经历了这个。我知道你说你不能使用 Session。我做到了。我用列表创建了一个复杂的类并存储了该列表。我在返回时检查它是否为非空,如果它被填充,我用它来重新创建我的报告。不浮华但有效。
    • 阅读我更新的帖子。这显然不是你想听到的,但这是我听说过的唯一方式(经过大量搜索)。
    • 我没有说我不能使用会话,我说它们的工作方式与我尝试使用它们的方式不同。我会看看在会话中存储控件列表是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2015-10-04
    相关资源
    最近更新 更多