gpt4 book ai didi

c# - ItemCommand 未在 Repeater 或 GridView 中首次单击时触发

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

这让我发疯了 2 天 - 希望之前有人看过。

我有这个问题,在转发器或 GridView 中第一次点击控件无法触发 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);
}

}

我想知道这是否是 View 状态问题,我应该在哪些页面事件中使用 DataBind()。我已经在不同的页面事件中尝试了数据绑定(bind),在页面和控件上启用 View 状态而不会导致结果发生变化。

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

最佳答案

迈克,
经过数小时的摆弄,我找到了问题的根源。
它与中继器或 GridView 没有特别的关系。
这只是一个动态控制回发问题。

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

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

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

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

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

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

希望这能解释它为什么有效,但就您而言,只需为其分配一个 ID,一切都会好起来的。
我认为分享它背后的机制以及为什么会这样会很有趣。 =)

关于c# - ItemCommand 未在 Repeater 或 GridView 中首次单击时触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034644/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com