这让我疯狂了2天 - 希望有人以前见过这个。
我有这个问题,在转发器或网格视图中第一次单击控件时无法触发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);
}
}
我想知道这是否是一个viewstate问题,以及在哪些页面事件中我应该使用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>
可能相关的一些进一步信息:
我注意到的是usercontrol的Page_Load事件是我重新绑定控件的地方。这可能是控制状态被重写的原因,但是如果我在ascx中向此区域添加if(!IsPostback),则此代码部分根本不像在aspx页面上那样触发。这将是我认为重新控制控制的正确部分。
答案 0 :(得分:8)
MikeW,
经过几个小时的摆弄,我找到了问题的根源
它与转发器或网格视图没有任何关系
它只是一个动态控制回发问题。
解决您的问题:
令人惊讶的是,您的代码中只缺少一行
在加载控件时,将其分配给其ID,如下所示:
UserControl uc = (UserControl)LoadControl(controlPath);
uc.ID = "mycontrol";
ph.Controls.Add(uc);
这样,当你回发时,页面知道哪个控件是哪个。
为了更容易解释,让我们简化问题 这是一个连续两次单击按钮的方案,动态创建另一个按钮:
ViewState
告诉页面有动态控件。像你一样,我们可以记住控件的路径或类的名称。 Page_Load
中,我们会查看ViewState
以查看我们正在尝试保留的控件,因此我们将其加载到那里(这相当于到上面的LoadUserControl()
函数。 Page_Load
将从ViewState
加载Button2。在清除占位符后,Button1的Click
事件将加载另一个Button2实例。 UniqueID
中为其分配一个ID,而这两个Button2将具有 ctl02 和 ctl03 之类的内容UniqueID
。 Click
不会触发。UniqueID
ctl02 。UniqueID
ctl02 。 那么,分配ID是如何工作的呢?
这样,生成的每个新控件都将具有相同的ID,因此在回发时,它可以找到它正在查找的内容,无论是在Page_Load
还是在另一个按钮的Click
事件中生成的。
希望这能解释它的工作原理,但就你所知,只需给它一个ID,一切都会好 我认为分享它背后的机制以及为什么会是这种情况会很有趣。 =)
答案 1 :(得分:0)
我不确定你的其余代码,但通常当我看到“第一个动作的行为与后续动作不同”的问题时,这是因为我在IsPostBack
的错误一侧放了一些东西部分。
例如,我发现自己在回发时会发生绑定,所以我的事件在第二次回发之前不起作用,因为第一次回发是在他们出生时,并且初始页面加载从未做过那部分。
我认为你走在正确的轨道上;确保你在适当的时刻绑定并整理你的活动。