【问题标题】:GridView DataKeys Collection Empty When GridView is in an EditItemTemplate当 GridView 在 EditItemTemplate 中时,GridView DataKeys 集合为空
【发布时间】:2013-03-07 16:09:02
【问题描述】:

全部,

仅供参考:我使用的是 VS2005,.net 2.0。

我有一个存在于 FormView EditItemTemplate 中的 GridView 控件。不幸的是,GridView 在该设置中行为不端,当页面回发并且触发 gridview 的选择命令时,其 DataKeys 集合为空。

这是事件的顺序:

  1. 用户浏览到页面
  2. 用户单击“编辑”(FormView 在 GridView 所在的位置呈现 EditItemTemplate)
  3. 用户单击再次回发的搜索并填充位于 EditItemTemplate 中的 GridView(此时 GridView 具有 DataKeys)
  4. 用户从引发行选择事件的 GridView 中选择项目
  5. 在回发时,GridView RowCommand 触发,- 我检查 CommandName = "select" 并运行我的代码,该代码抛出异常,因为此时 DataKeys 集合为空!

更多细节:GridView 位于 FormView 的 EditItemTemplate 中的用户控件中。

注意:

当我将 GridView 移出 FormView 的 EditItemTemplate 时,我能够解决此问题,现在 DataKeys 集合不为空。不幸的是,GridView 必须在 EditItemTemplate 中,以便用户选择他搜索的客户端。

任何见解将不胜感激。

事件处理代码:

protected void ctlSearchResults_RowCommand(object sender, GridViewCommandEventArgs e)
{
    // user has selected the client from the keyword search result list
    if (e.CommandName == "select")
    {
        GridView searchResultsGrid = (GridView)e.CommandSource;
        int selectedRowIndex = int.Parse((string)e.CommandArgument);
        int clientId = (int)searchResultsGrid.DataKeys[selectedRowIndex][Client.PROP_ENTITYID];
        // raise Selected event
        _OnSelected(new ClientSelectedEventArgs(clientId));
    }
}

【问题讨论】:

  • 你能显示你的 GridView RowCommand 事件代码吗?
  • 是的,我已将事件处理代码添加到问题描述中。索引超出范围异常发生在我尝试通过引用 DataKeys 集合来分配 clientId 的行上。此时的 DataKeys 集合大小为零。

标签: asp.net .net gridview


【解决方案1】:

DataKey 集合为空的原因是您在搜索结果gridview 的数据绑定之前访问该集合。我发现this 指南在调试处理问题的顺序时很有用。

【讨论】:

  • GridView 已经是数据绑定的,并在回发时从视图状态(或控件状态)接收其状态。这可以通过查看 grid.Rows 集合来观察(每一行都在那里)。不幸的是,我不能对 grid.DataKeys 集合说同样的话,它是空的,-它应该在回发时从视图状态(或控制状态)中恢复,-这是我对 gridview 工作方式的理解,我已经习惯了因为我已经做了很多次了。不幸的是,在这种情况下,我有更深的嵌套,并且 Gridview 稍后绑定(编辑时)。
  • 只是添加到我上面的评论:有趣的是,当我从编辑项目模板中移动 GridView 时,它可以工作!我没有改变事件的顺序,它们仍然按照确切的顺序发生,只是我的 gridview 在 Edit item 模板之外。显然,确实有问题,我认为这与我的代码无关。
  • 顺便说一句,您发送到页面生命周期概述的链接(这是一篇很棒的文章)-信不信由你,这张图表是用彩色打印出来的,挂在离我几英寸远的墙上.
  • 作为实验的结果,我发现行集合将在页面生命周期的“加载”阶段从视图状态填充,但无论出于何种原因,数据键集合都是空的,直到数据绑定已完成,这似乎在“预渲染”阶段结束。我通过在我的命令事件处理程序中设置一个标志来解决这个问题,然后该标志用于从 DataBound 事件触发某些进程。在您的情况下,您可以将选定的行索引分配给页面变量,然后在数据绑定事件中检查/使用该变量来引发选定的事件。
  • 感谢您的意见。就我而言,解决方案更简单:我没有使用 DataKeys 集合,而是不使用它,我只是简单地添加一个隐藏字段来存储记录的 ID,完成。 DataKeys 集合在页面生命周期中无法正常播放。
【解决方案2】:

我相信您希望将 sender 转换为 GridView,如下所示:

GridView searchResultsGrid = sender as GridView;

【讨论】:

  • 不管怎样,它完成了同样的事情,但这并不能解决 gridview.DataKeys.Count == 0 的问题。
  • 那么你可以:int clientId = (int)searchResultsGrid.DataKeys[searchResultsGrid.SelectedIndex ][Client.PROP_ENTITYID];
  • 如果集合为空,则不会。
【解决方案3】:

试试这个:

int selectedRowIndex = Convert.ToInt32(e.CommandArgument);
int clientId = Convert.ToInt32(this.yourGridView.DataKeys[selectedRowIndex]["yourDataKey"].Value);

【讨论】:

  • 您看到的所有代码都是有效的。同样,问题是 gridview.DataKeys.Count == 0 但它应该是绑定到 gridview 的记录数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2014-05-21
相关资源
最近更新 更多