ItemCommand 在 Repeater 或 GridView 中第一次单击时不会触发

2023-12-12

这两天已经让我发疯了——希望有人以前见过这个。

我遇到这样的问题:第一次单击中继器或网格视图中的控件无法触发 ItemCommand 事件,但所有后续单击都有效。控件被加载到 Base.aspx 上的占位符中,如下所示

    private void LoadUserControl()
    {
        string controlPath = LastLoadedControl;

        if (!string.IsNullOrEmpty(controlPath))
        {
            ph.Controls.Clear();

            UserControl uc = (UserControl)LoadControl(controlPath);
            ph.Controls.Add(uc);
        }

    }

我想知道这是否是一个视图状态问题,以及在哪些页面事件中我应该使用 DataBind()。我在不同的页面事件中尝试了数据绑定,在页面上启用视图状态并进行控制,而不会改变结果。

这是 GridView 模板,但我对转发器控件也有相同的行为,所以我不相信它是这个问题的控件。

<ItemTemplate>
       <asp:RadioButton ID="rbEnable" GroupName="MyGroup" runat="server" Text="Enabled" Checked="<%# ((EducateMe.BaseTypes.AbstractLink)Container.DataItem).IsActive == true %>" />
       <asp:RadioButton ID="rbDisable" runat="server" GroupName="MyGroup" Text="Disabled" Checked="<%# ((EducateMe.BaseTypes.AbstractLink)Container.DataItem).IsActive != true %>" />
       <asp:Button ID="btnEnable" runat="server" CommandArgument="<% # Container.DataItemIndex %>" CommandName="Enable" ToolTip="Enable" Text="Save" />
       <asp:Button ID="btnDisable" runat="server" CommandArgument="<% # Container.DataItemIndex %>" Visible="false" CommandName="Disable" ToolTip="Disable" Text="Disable" />
    </ItemTemplate>

一些可能相关的进一步信息:

我注意到用户控件的 Page_Load 事件是我重新绑定控件的地方。这可能是控件状态被重写的原因,但如果我将 if(!IsPostback) 添加到 ascx 中的此区域,则此代码部分根本不会像在 aspx 页面上那样触发。我认为这将是重新绑定控件的正确部分。


MikeW,
经过几个小时的摆弄,我找到了问题的根源。
它与中继器或网格视图没有什么特别的关系。
这只是一个回发动态控制问题。

为了解决您的问题:
令人惊讶的是,您的代码中只缺少一行。
当您加载控件时,为其 ID 分配一些内容,如下所示:

UserControl uc = (UserControl)LoadControl(controlPath);
uc.ID = "mycontrol";
ph.Controls.Add(uc);

这样,当您回发时,页面就知道哪个控件是哪个。

为了更容易地解释这一点,让我们简化问题。
以下是连续单击一个按钮两次动态创建另一个按钮的场景:

  • 创建一个按钮 Button1,单击该按钮时将动态加载另一个按钮 Button2。假设 Button2 的操作就像显示当前时间一样简单。
  • 现在,单击 Button1。
  • 要保留 Button2,您必须使用ViewState告诉页面有一个动态控件。就像您所做的那样,我们可以记住控件的路径或其类的名称。
  • 当页面回发时,在Page_Load,我们看ViewState看到有一个我们试图保留的控件,所以我们就在那里加载它(这相当于你的LoadUserControl()函数如上)。
  • 现在,Button2 是可见的,当单击时,它会很好地执行其操作。
  • 不要点击Button2,只需再次点击Button1(相当于你的case在两个不同的动态控件之间切换)。
  • 猜猜现在会发生什么:Page_Load将从中加载 Button2ViewState。还有Click清除占位符后,Button1 的事件将加载另一个 Button2 实例。
  • 由于您没有为其分配 ID,因此它会为自己分配一个 IDUniqueID,这两个 Button2 将具有类似的内容ctl02 and ctl03
  • 现在单击按钮2。
  • 你会说“没关系,我们正在覆盖旧的”。可以,但是没有身份证就不行。
  • 由于您没有给它一个 ID 来在回发时识别它,因此它将利用UniqueID,依次生成。
  • 现在页面正在寻找ctl03,它不存在,所以Click不着火。
  • 但是,现在我们有了一个全新的 Button2,其中UniqueID ctl02.
  • 单击这个新的 Button2 就可以正常工作,因为在回发时,它是唯一的 Button2,因此它碰巧会有一个UniqueID of ctl02.

那么,分配 ID 是如何使其发挥作用的呢?
这样,生成的每个新控件都将具有相同的 ID,因此在回发时,它可以找到它要查找的内容,无论它是否是在Page_Load或者在另一个按钮上Click事件。

希望这能解释它为什么起作用,但只要你关心,只要给它分配一个 ID,一切都会好起来的。
我认为分享其背后的机制以及原因会很有趣。 =)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ItemCommand 在 Repeater 或 GridView 中第一次单击时不会触发 的相关文章

随机推荐

  • 无法安装 HTTPBuilder

    我正在尝试安装HTTPBuilder像这样 Grab group org codehaus groovy modules http builder module http builder version 0 7 2 但是 我收到此错误 ja
  • 如何从像素缓冲区创建 Win32 HBITMAP

    我尝试从像素缓冲区创建 HBITMAP 并显示它 这是我创建 HBITMAP 的代码 char buffer 640 480 3 memset buffer 255 640 480 3 BITMAPINFO bm sizeof BITMAP
  • Django 查询集匹配所有相关对象

    假设我有一个从 Coconut 到 Swallow 的外键 即 一只燕子携带了许多椰子 但每个椰子只被一只燕子携带 现在假设我有一个从 husk segment 到 Coconut 的外键 现在 我有一个 husk segments 列表
  • 整数太大[重复]

    这个问题在这里已经有答案了 嗨 我无法理解为什么这不起作用 if Long parseLong morse 4545454545 System out println 2 其中莫尔斯只是一串数字 问题是它说整数太大 4545454545 但
  • 如何从 CSV 中提取命名列?

    我有一个包含大约 50 列的 csv 文件 但我只需要其中大约 10 列 我希望能够从该 csv 文件中提取所需的列到新的 csv 文件中 这篇文章的最佳答案如何删除 CSV 文件中的列 看起来它会完全满足我的需要 但这是我每天都需要做的事
  • 使用 GET 的 MVC AttributeRouting - 返回 405 - 不允许的方法

    我刚刚在研究一种新的控制器操作方法 我有点困惑为什么会看到 405 我已经在我的 API 上定义了几个 GET 属性方法 它们都按预期运行 举个例子 这工作得很好 GET entries page JsonExceptionFilter p
  • 与绘图线一起创建标签

    我问了一个有关自定义小部件的问题 但对我是否需要它以及应该如何进行感到困惑 我目前有这门课 public class GUIEdge public Node node1 public Node node2 public int weight
  • 从 GCP 连接到 Azure SQL 时出现 NoClassDefFoundError com/microsoft/aad/adal4j/AuthenticationException

    我的 Spark 项目位于 GCP 中的 data proc 上 并在 Spark 提交上运行驱动程序 当我尝试连接到 Azure SQL DB 时 它抛出以下异常 20 39 15 DOCKER Exception in thread m
  • 为什么无序流比有序流更快?

    我正在阅读 Richard Warburton 所著的 Java 8 书籍 并得出以下结论 某些操作在有序流上的成本更高 这个问题可以 可以通过消除排序来解决 为此 请调用流的unordered方法 我对此感到非常困惑 假设我们有Strea
  • Pandas 反向分割函数

    我有一个 Pandas Dataframe 其中有一列 如下所示 Car Make 0 2017 Abarth 124 Spider ManualConvertible 1 2017 Abarth 124 Spider AutoConver
  • 已过时 - 关键帧之间的 FFMPEG 解码伪影

    将问题标记为过时 因为使用已弃用的 avcodec decode video2 I m currently experiencing artifacts when decoding video using ffmpegs api On wh
  • 在 Tkinter 上显示标签一段固定的时间

    我正在使用 Tkinter 在 Python 2 7 中创建一个 GUI 应用程序 我有这段代码 vis Label pur text Purchase Added successfully font 8 vis place x 150 y
  • 如何将 Intel 80386 机器代码转换为汇编语言?

    我被赋予以下任务 考虑以下十六进制值序列 55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3 该字节
  • 将表 A 中的行移动到表存档中

    是否可以每周自动将 3 天前的行移动到 mysql 中另一个名为 Table Archive 的表中 表A例如 ID stringvalue Timestamp 1 abc 2011 10 01 2 abc2 2011 10 02 3 ab
  • JPA/Hibernate 提高批量插入性能

    我有一个数据模型 该模型在 1 个实体和 11 个其他实体之间具有一对多关系 这12个实体一起代表一个数据包 我遇到的问题与这些关系的 多 侧发生的插入数量有关 其中一些可以有多达 100 个单独的值 因此要将整个数据包保存在数据库中 最多
  • git如何存储文件?

    我刚刚开始学习 git 为此我开始阅读Git 社区书籍 在这本书中他们说SVN和CVS存储文件之间的差异 而git存储所有文件的快照 但我不太明白他们所说的快照是什么意思 git 真的会在每次提交时生成所有文件的副本吗 因为这就是我从他们的
  • C++ 随机数

    在以下情况 http www fredosaurus com notes cpp misc random html 它提到如果我们想生成一个范围内的随机数1 10 我们可以执行以下操作 r rand 10 1 为什么我们要添加1 您能解释一
  • iPhone URL 编码问题

    有一个小问题 尝试将 XML 发布到服务器 为此 我必须以 URL 格式对 XML 字符串进行编码 NSString encodedString NSString stringWithFormat xmlValue post stringB
  • Bash Shell:无法使用变量 $ 作为运行 tar 的路径

    这是一个非常简短的问题 但是放置变量是否存在语法错误 example作为 bash 文件中 tar 的参数 我将文件写为 only portion that really matters bin bash tar cvpzf filenam
  • ItemCommand 在 Repeater 或 GridView 中第一次单击时不会触发

    这两天已经让我发疯了 希望有人以前见过这个 我遇到这样的问题 第一次单击中继器或网格视图中的控件无法触发 ItemCommand 事件 但所有后续单击都有效 控件被加载到 Base aspx 上的占位符中 如下所示 private void