gpt4 book ai didi

c# - GridView RowCommand 不是第一次触发

转载 作者:行者123 更新时间:2023-11-30 21:06:00 26 4
gpt4 key购买 nike

这可能看起来像是重复的,但我不这么认为。我已经搜索过 stackoverflow,可能还不够。

这是我的挑战:

<asp:LinkButton runat="server" ID="DeleteRow" CommandName="deleterow" 
CommandArgument='<%# Eval("ID") %>' Text="Delete"
OnClientClick="return confirm('Are you sure you want to delete this record?');" />

如果您第一次单击该链接,则不会触发 OnRowCommand。当您第二次单击它时,它会起作用。

我查看了源代码,发现了这些差异。

//When you first load the page: the GUID is the PK for that row 
1. javascript:__doPostBack('ctl00$content$gvSchoolClasses$58fd1759-f358-442e-bf73-2e9cedfc27e8$DeleteRow','')

//After the link was clicked the first time, the link changed and the ID empty, but works
2. javascript:__doPostBack('ctl00$content$gvSchoolClasses$ctl02$DeleteRow','')

我从 asp:LinkBut​​tonhref 复制了点击前和点击后的两个代码。

怎么了?我的页面上只有一个事件 RowDataBound

  protected void gvSchoolClasses_RowDataBound(object sender, GridViewRowEventArgs e)
{
e.Row.ID = Guid.NewGuid().ToString();
}

protected void Page_Load(object sender, EventArgs e)
{
CheckAuthentication();

if (!Page.IsPostBack)
{
ClassesAcademicYearLabel.Text = "- Year " + Setting.Year;
//FillClassesList(); //filling some combo boxes. Have checked the codes here too
//FillLettersList(); //they didn't affect the Grid
FillGrid();
}

ClassErrorLabel.Visible = false;

}

最佳答案

通过在 RowDataBound 事件中设置行的 ID 属性,您已经创建了您正在观察的问题。

由于 RowDataBound 事件直到页面的控件已添加到集合中后才会被触发,因此 ASP.NET 无法更新已计算的客户端引用。因此,该命令不会以您期望的方式被触发。

我注意到您已经将 CommandArgument 属性设置为在 RowDataBound 事件中生成的 ID,这也可能是您问题的一部分(取决于事件触发的顺序;我手边没有管道图)。

编辑:对此的快速修复可能是简单地将 ClientID 属性(抱歉,不是确切的名称,但智能感知应该让您完成剩下的事情)设置为某种手动而非自动确定。这样,您设置的 ID 永远不会被框架更改。

要详细说明为什么会出现此问题,请考虑提供的客户端 ID:

ctl00$content$gvSchoolClasses$ctl02$DeleteRow

通过获取已声明的 ID (DeleteRow) 并连续向上遍历控件层次结构并将父 ID 添加到字符串中,可以保证此 ID 是唯一的(对于此页面)。 JS 代码可以确信将此字符串传递给 getElementById 将以一致、可预测的方式运行。

为了能够生成所述 ID,层次结构中的所有控件都必须已经存在并由呈现引擎说明。

现在让我们考虑当控件的 ID 属性更改时会发生什么(注意这不是 ClientID,而只是名称为 ID 的属性) .

ctl00$content$gvSchoolClasses$58fd1759-f358-442e-bf73-2e9cedfc27e8$DeleteRow

您会注意到,该行的命名容器 (cl02) 不再是行的命名容器,而是您生成并分配给它的 GUID。尝试使用先前分配的 ID 访问此容器的客户端 JS 将会失望,因为它将不再按预期工作!

当 ASP.NET 控件通过调用 javascript:__doPostBack('ctl00$content$gvSchoolClasses$58fd1759-f358-442e-bf73-2e9cedfc27e8$DeleteRow','')

回发会很好地发生,但是(你可以通过检查回发的表单参数来验证这一点)当服务器处理请求时,它将尝试(从 View 状态)重新水化一个不'存在。因此,它将创建一个不知道已发出命令的控件的新实例(具有正确的 ID),因此永远不会触发 XXXCommand 事件。由于没有发生数据绑定(bind)(这是一个回发,并且您的代码正确地检查了该条件),因此 ID 永远不会重置,并且命令可以正常触发

关于c# - GridView RowCommand 不是第一次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11420260/

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