gpt4 book ai didi

c# - 在单个页面中处理来自动态创建的控件的多个 "chained"回发

转载 作者:行者123 更新时间:2023-11-30 17:45:15 26 4
gpt4 key购买 nike

我正在尝试为一个项目构建一个非常具体的搜索页面,但我在处理由单个页面上动态生成的控件调用的多个回发时遇到了很多麻烦。

页面必须像这样工作:

  • 有一个复选框,“详细搜索”,会在选中/取消选中时引起回发。

    • 当详细搜索未激活时,会显示一个包含内容和按钮的简单网格。没什么特别的。

    • 当详细搜索处于事件状态时,必须从一些动态数据生成 N 复选框,这些数据代表您希望进行搜索的部分。在复选框下方,将出现一个支持 AJAX 的选项卡控件,最初没有选项卡页面。

      • 选中其中一个部分复选框时,将发生回发。回发后,将在用户选择的部分中搜索数据,然后将包含结果的 GridView 和部分名称的新标签页添加到选项卡控件中。如果未选中该复选框,标签页将在回发后再次从控件中消失。

现在的问题是,几乎所有东西都必须动态生成,而且几乎所有东西都与其他东西相连。

第一期:处理“详细搜索”复选框。听起来很容易,不是吗?我最初的想法是在检查/取消检查事件处理程序期间将 Page.Viewstate["DetailedSearchEnabled"] 设置为 truefalse,然后创建控件在 Page_Load 期间动态检查 DetailedSearchEnabled 的值。

不。回发事件处理发生在 Page_LoadPage_LoadComplete 之间。需要额外刷新才能让事情按预期工作。

<< 然后我将在 Page_LoadComplete 上生成控件! >>

不。这些控件也需要事件处理,如果它们是在 Page_Load 之后生成的,它们将无法正确连接。

一个可能的解决方案是在 Page_Load 上提前生成所有内容,并且仅在 Page_LoadComplete 上隐藏/显示控件。但这效率很低,而且这个搜索页面的一个重点是只应生成最少数量的控件。

这项任务的困难似乎来自事件连接和页面生命周期的工作方式。

肯定有更好的方法来解决这个问题。

最佳答案

First issue: dealing with the "Detailed search" check box.

正确的做法(如果你想使用页面回发)如下:

  • 在 CheckChanged 事件处理程序中,将 Checked 属性的值保存到 ViewState["DetailedSearchEnabled"]。如果值为真,则将动态复选框添加到页面。如果值为 false,则查找并删除它们。
  • 重写 LoadViewState。调用 base.LoadViewState 后,重新创建动态复选框并在 ViewState["DetailedSearchEnabled"] 为真时连接它们的事件。请注意,Page_Load 和 Page_LoadComplete 都不适合执行此操作。

是的,您应该在页面生命周期的两个时间点创建动态复选框。我推荐一个辅助方法。

一般来说,您的事件处理程序应该只添加或删除受那些特定事件影响的动态控件(如果有的话),但是 LoadViewState 应该重新创建上一个页面请求中存在的所有动态控件.您必须在 View 状态中存储足够的信息,LoadViewState 才能执行此操作。

我对 this other question 的回答演示如何添加和删除动态控件。您可能想将其用作引用。

关于c# - 在单个页面中处理来自动态创建的控件的多个 "chained"回发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28077289/

26 4 0